破军安全实验室
以翔科技旗下高端网络安全攻防服务团队。 安全服务包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等。
本文约3300字,阅读时间约8分钟。
0x00 前导码
包装和屠宰是相辅相成的过程。 没有一种方法可以全部打包通过,更多的是根据目标进行测试和研究。
截图的顺序是乱的,所以一些测试项的一些不相关的文件名是不同的。
ü 如果目标是关键字(正则匹配)查杀,则使用不敏感函数
ü以类和类破坏的形式绕过弱动态扫描
你不直接使用$_GET和$_POST来获取数据,那里是123456e123456(php7可用)
ü XOR、十六进制传递明文字符串
ü 偏坐位,如文件包含、反序列化、新进程执行等。
ü 当遇到waf时,去preg_replace和preg_replace_callback讨论一下
因为网上的查杀可能会被引擎收录,所以我们测试了两个地址,可以看到是不一样的,没有哪个引擎能找到所有的查杀
WEBDIR+ - WebShell 扫描服务 - OpenRASP 团队
https://scanner.baidu.com/#/pages/intro
SHELLPUB.COM在线查杀
https://n.shellpub.com/
大型网站上常见
D盾、云锁、保安狗、守护神
引用大鳄的话,“目前主流的木马查杀方式有:静态检测、动态监控、日志检测。
A。 静态检测通过匹配特征码、危险函数和木马特征值来查杀木马程序。 其特点是快速、方便,对已知木马程序的准确率较高。 其缺点是误报率较高。 0day木马程序很难发现,而且很容易被绕过。
b. 动态测量是通过木马程序的动态特性来测量的。 当木马程序上传到服务器后,攻击者总会执行它。 木马程序执行时表现出的特征就是所谓的动态特征。
C。 日志检查主要通过日志分析度量技术来实现,主要通过分析大量日志文件并改进请求模型来度量异常文件。 其优点在于,当网站的流量水平达到一致值时,这些测量方法具有较大的参考价值。 其缺点是存在一定的误报率。 对于大量的日志文件,检查工具的处理能力和效率会变得比较低。 ”
套用掠夺者的说法,“调用eval等代码执行函数,最终都会调用php内核的zend_compile_string函数,所以这个函数里只用Hook来住。”等安全防护产品的“一字WebShell免疫” D盾和云锁都是基于这个道理,无论你怎么改一句话,最终还是逃不出这扇门。
如今新版本的入侵防护产品不仅会hook代码执行,还会做文件IO和命令执行,并根据web文件的行为来判断是否是webshell。 ”
自己实际研究,环境如下,php版本5.6
D-shield 2.1.6版本,查杀数据库已更新(大量查杀规则不更新)
守护神也已更新
0x01D屏蔽包装测试
最新版本的坐骑如蚁剑、冰蝎、哥斯拉等都被标记为已知侧门
使用守护神极限模式搜杀,所有关键词都报,“菜刀包一个字”不报
这些关键词很容易绕过,所以我们还是主要研究D盾绕过,最后测试时只用D盾和守护神一起扫杀。
最后看一下云锁扫描结果22/34,也有绕过
安曲沟最差,只能识别已知的侧门
收集几款新的“免杀马”,经过测试GodzillabypassD.php、phpbypass202011.php这两个确实是加壳的
哥斯拉
测试哥斯拉的连接,这里需要2.9版本,3.03版本的加密设备无法匹配(初始化失败)
敏感函数base64_decode的定制实现
使用class+nvoke绕过检查并执行eval
99999e9999999
重点是这个。 我还是第一次见你用99999e9999999来绕过它。 我坐起来了
将post改为获取表单,并在浏览器中传递值。 看,我发现参数1的值确实已经正式参数化为[0]
再次传入phpinfo(); 测试,执行成功
测试发现只有科学数字足够大才能达到疗效
0x02绕过研究
包装方法如下
拼接、拦截、翻转、编码、类型转换,主要用于正则匹配和查杀绕过
以断言为例
改拼接:"a"."s"."s"."ert"
或
$a="asse"
$b="rt"
$c=$a.$b
改截取:$a="aasseerrtt"
再自定义函数取字符串单或者双数位置,形成assert
比较复杂的是“编码+(数字转字符)”的处理
字符串翻转同上,通常是多种方法的组合
编码一般是base64或者url,但是现在的waf支持一层解码查杀,要看是性能还是安全
类型转换就是将int类型转换为字符进行拼接,或者在转换前用数字预估目标值
话不多说,比如将assert、eval的调用方式改为call_user_func_array()或call_user_func()
使用工具对 php 代码进行混淆和加密。 注意,如果代码量太小,则无法加密。 缺点是会降低性能成本,但这与我们无关
原始代码
混淆和加密后的EnPHP(已开源)
http://enphp.djunny.com
罐头等级从 4 降至 1
使用&&符号执行同一行的所有代码php 字符串拼接php 字符串拼接,绕过正则匹配类查杀
($a = 'assert')&&($b =$_POST['a'])&&call_user_func_array($a, array($b));
简单不多解释,玄学被绕过,实测有时加个斜线反而会被杀
call_user_func_array变为call_user_func_array
随意写一个函数,并隐藏函数上的代码执行。 之前的研究都会常用到,这里就不展示了。
或者使用类的析构函数来实现执行
比如base64_decode、substr这样敏感的自写函数,Godzilla是自写实现的base64decode,经常被绕过不显示
如果在使用参数之前对语句进行处理,实际测试对绕过影响不大
$a==$a?$a:$a
或
$a==$a?$a:"error"
随机选择一个通配符进行绕过,这里我选择垂直制表符。实测疗效一般,只能绕过正则匹配类型的查杀
$b=$_POST['a'];
$a="x0Bassert";
call_user_func_array(trim($a), array($b));
最后,请记住在使用垂直制表符时使用修剪或其他功能来消除空格。
常用的打包方法是使用XOR来隐藏关键字。 虽然可以算是一种加密绕过,但是无论XOR还是aes,在没有相应秘钥的情况下都很难直接获得明文代码。
XOR处理足够简单且有效。 加上编码操作后,看起来花样还蛮多的。 XOR 具有单字符、多字符和循环转换。 通常是多字符异或,即abcd^1234
通常,明文字符会被编码成十六进制,用于避免关键字查杀
一些弱匹配可以通过添加注释来规避。 常见且简单的bypass形式可以随意添加,只要不影响参数和函数定义的使用即可。
共同手段。
在PHP中,$var(单港币)代表一个名为var的普通变量,它存储字符串、整数、浮点数等任意值。而$$var(双港币)是一个引用变量,用于存储$var 的值。
这个东西可以理解为c的函数指针,即有一个函数abc(),定义*a=abc(),$$a就是**a=*a,不写也没关系不懂,你知道php上的函数可以这样引用就OK
传递参数时,不要直接使用$_GET和$_POST,而是使用$_REQUEST、$GLOBALS、$_SESSION、$_SERVER中的参数来间接传递值,这样确实可以绕过很多检查
无意间翻到了ctf序列化文件,测试了一下,发现可以通过查杀。 序列化文件中有一个eval函数报告检查和查杀,对应的反序列化则没有报告。 这种编码加密的组合也有很多坐姿
网络访问效率
但网上查杀#/pages/intro过不了