前言
相信各位师傅都有自己过waf一句话的思路,我这写一下自己常用的思路与及具体方法,如有错误,还望大家斧正。上次很多师傅问我要的web漏扫的github地址抱歉还不能给你们,(毕设没答辩完,而且还没写完Orz)
Webshell
这里,我主要是写phpwebshell的bypass(主要是其他的没研究过),安全狗的版本是在官网下载的apache4.0版本。
D盾是2.0.9的
在bypass之前我们得先了解一下最基本的webshell的组成。
所以不管webshell再怎么变化,都必须满足这两点。我们就可以根据这两点来进行变化从而达到bypass的目的。当然我们要绕过waf,首先就得先了解waf的检测机制,这里我们先测试安全狗的,先准备几个文件。
扫描一下
带有eval的敏感字符与及敏感传参的$_POST并没有报毒,可以猜测waf的一部分机制是参数追踪与及综合判定。
Bypass
现在我们就可以尝试一些方法进行绕过。
1、关键字变形
对于关键字变形,能用的实在太多了,php是个非常强大的语言对于字符串的各种变化都支持的非常好。我们可以用进制转换,十六进制,八进制之类的。
这样子就bypass了安全狗,或许会有人会说,为什么不用eval而用assert。其实我也想用eval但是,eval并不是一个函数,不支持这样子的调用。具体分析可以自行百度一下。但是很明显这样子过不了D盾
问题不大,我们可以尝试更多的方法。
2. 算术运算
我们可以同通过自增,异或,取反等方法来获得我们想要的字母,再组合成函数,动态调用即可。
例如:
通过定义a然后进行自增运算得到其他文明想要的字符,但是注意并不能进行自减
但是我们这样子取出来的只有小写字符,并不能得到我们想要_POST,_GET。在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以这里我们就可以用异或,取反来取我们想要的大写字母。
写个php脚本。
把能想到特殊字符全部丢进去得到遍历异或的结果,然后再取我们想要的字符。这里我们就以取_POST为例子。
_可以用|和#来进行异或得到
然后一个个找出来,得到的结果就是:
结合我们上面的自增我们可以得到以下代码
测试一下,可以过安全狗,但是过不了D盾,可是我们的安全等级下降了,问题不大,继续肝。
3.编码加拼接
通过base64与及rot13编码,动态函数调用得到以下代码
稳过安全狗,但是还是没有过D盾,可是等级我们再次降低了一个级别,变成二级了。
我们可以再结合一下上面所说的,把自增运算与及参数的传递打破一下检测的规则。
检测一下:
可以发现,安全狗我们再次无压力,并且D盾等级再次降低,降到了一级,只报了一个变量函数,针对这一点,我们再改一下。这次我们可以采用数组的方式,经过多次变换,再加上参数扰乱达到bypass的目的。
代码如下:
测试如下:
可以发现我们已经bypass掉了安全狗,D盾,深信服,360主机卫士。
当然远不止这种方法,php实在太灵活了。
- uopz_function()
- uasort()
- uksort()
- array_uintersect_uassoc()
- array_udiff_assoc()
等等,都可以用来bypass,用法可以自己尝试。
我这贴出两种思路,这个一句话是在鹏城杯线下赛中出现的,通过自增得到关键字,然后定义类,类内函数自调用来进行bypass。
另一种,我们可以利用php的反射机制,获取注释的内容,然后拼凑出assert,从而动态执行,代码如下。
检测效果如下:
这样子也可以bypassD盾安全狗 等。
Bypass的思路还有:
- 缓存写webshell
- 回调函数
- 正则匹配绕过
- 匿名函数
In the end
不管是什么waf,摸清楚规则,不断尝试才是王道,借用前辈的一句话。
“知识面决定攻击面”。
共勉。