WAF绕过可大致分为三类:
1.白盒绕过
2.黑盒绕过
3.fuzz测试
白盒绕过:
通过代码分析,来进行绕过。
黑盒绕过:
1.架构层面绕过waf
2.资源限制角度绕过waf
3.协议层面绕过waf
4.规则层面绕过waf
(1)架构层面绕过waf
1.寻找源网站绕过waf检测
主要针对的是云waf,找到源网站的真实地址,进行绕过,有点像CDN
云waf是部署在远端的拦截设置,可检测是否含有注入代码并进行拦截
有CDN节点的话有3种方法绕过:
1.可以通过超级Ping的方式,网上有很多,可以知道是否存在CDN节点,不同地区得到的ip地址返回不同。
2.可以进行注册,注册信息是不经过CDN的,直接访问源网站,比如发送邮件通过返回email数据的网址得到源网站的真实地址。
3.可以通过国外的一些ip地址进行访问,因为有些小网站不对外网设置CDN,因而可以直接访问源网站。
2.通过同网站绕过waf防护
在一个网段中,可能经过的数据不会经过云waf,从而实现绕过。
渗透同一网段中的另一台机器3,通过3和2的数据交互,可以间接渗透2
(2)资源限制角度绕过waf
一般waf的执行需要优先考虑业务优先的原则,所以对于构造较大、超大数据包可能不会进行检测,从而实现绕过waf
网站中数据传输有get和post两种形式,当传递id时,waf会对get进行检测,而不会对post进行检测,因为一般post传输的数据较大,且前台不可见,所以可以通过post进行注入绕过waf,一般存在于一些上传中,传一些图片之类的。
(3)协议层面绕过waf
1.协议未覆盖过waf 比如由于业务需要,只对get型进行检测,post数据选择忽略。
2.参数污染 index?id=1&id=2 waf可能只对id=1进行检测。
(4)规则层面的绕过
1.sql注释符绕过
~1.union/**/select我们将union select之间的空格使用注释符进行替换(使用于对union select之间的空格进行检测的情况)
~2.union/*sdhaidhoahdois*/select我们在注释符中间填充乱七八糟的内容。
~3.union/*aaaaaaaaabbbbbccccccdddddeeeee%%%%%%%*/select构造较大数据。
~4./*!union select*/内联注释 我们使用内联注释,mysql特有。
2.空白符绕过
~1.mysql空白符:%09;%0A:%0B;%0D;%20;%0C;%A0;/*XXX*/
~2.正则空白符:%09;%0A:%0B;%0D;%20;
%25其实就是百分号 %25A0就是空白符
3.函数分隔符号
将一个函数进行分割concat()
caoncat%2520(
concat/**/(
concat%250c(
concat%25a0(
3.浮点数词法解释
waf对于id=1可以进行检测,但是对于id=1E0、id=1.0、id=\N可能就无法进行检测
5.利用error-based进行sql注入
6.mysql特殊语法
7.大小写绕过
如果对关键字and or union等进行了过滤,可以考虑使用大小写混合的方法
Qr aNd UniOn
但是很多时候有函数会对部分大小写进行过滤,这个时候我们可以考虑使用双写的方法
8.关键字重复
OORr->or
9.关键字替换
如果还是无法绕过,可以考虑替换的方法
and->&& or->|| like可以替换= <>等价于!=
方法有很多,这里可能列举不足。。。主要就是看谁思路更猥琐
fuzz测试:
可以使用burpsuite配合手工进行测试,后期测试成功后再用脚本进行处理。