【免杀】————2、Webshell如何bypass安全狗,D盾

前言

相信各位师傅都有自己过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,摸清楚规则,不断尝试才是王道,借用前辈的一句话。
“知识面决定攻击面”。
共勉。

转自:https://mp.weixin.qq.com/s/aAK2pLf3XX8AKz2-UoQbYQ

猜你喜欢

转载自blog.csdn.net/Fly_hps/article/details/89010844