龙空技术网

Webshell如何bypass安全狗,D盾

合天网安实验室 123

前言:

当前姐妹们对“php安全狗”可能比较注意,大家都想要学习一些“php安全狗”的相关知识。那么小编在网上网罗了一些对于“php安全狗””的相关知识,希望大家能喜欢,看官们快快来了解一下吧!

原创: MOZA 合天智汇

01

前言

相信各位师傅都有自己过waf一句话的思路,我这写一下自己常用的思路与及具体方法,如有错误,还望大家斧正。

上次很多师傅问我要的web漏扫的github地址抱歉还不能给你们,(毕设没答辩完,而且还没写完Orz)

02

Webshell

这里,我主要是写phpwebshell的bypass(主要是其他的没研究过),安全狗的版本是在官网下载的apache4.0版本。

D盾是2.0.9的

在bypass之前我们得先了解一下最基本的webshell的组成。

所以不管webshell再怎么变化,都必须满足这两点。我们就可以根据这两点来进行变化从而达到bypass的目的。

当然我们要绕过waf,首先就得先了解waf的检测机制,这里我们先测试安全狗的,先准备几个文件。

扫描一下

带有eval的敏感字符与及敏感传参的$_POST并没有报毒,可以猜测waf的一部分机制是参数追踪与及综合判定。

03

Bypass

现在我们就可以尝试一些方法进行绕过。

关键字变形

对于关键字变形,能用的实在太多了,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

回调函数

正则匹配绕过

匿名函数

....

04

In the end

不管是什么waf,摸清楚规则,不断尝试才是王道,借用前辈的一句话。

“知识面决定攻击面”。

共勉。

Ps:文中所有文件都已打包。

传送门:

标签: #php安全狗