1.前言
去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常谈的话题也没什么可写的。很多人一遇到waf就发懵,不知如何是好,能搜到的各种姿势也是然并卵。但是积累姿势的过程也是迭代的,那么就有了此文,用来总结一些学习和培养突破waf的思想。可能总结的并不全,但目的并不是讲那些网上搜来一大把的东西,So…并不会告诉大家现有的姿势,而是突破Waf Bypass思维定势达到独立去挖掘waf的设计缺陷和如何实现自动化的Waf Bypass(这里只讲主流waf的黑盒测试)。
2.搞起
当我们遇到一个waf时,要确定是什么类型的?先来看看主流的这些waf,狗、盾、神、锁、宝、卫士等等。。。(在测试时不要只在官网测试,因为存在版本差异导致规则库并不一致)。
1.云waf:
在配置云waf时(通常是CDN包含的waf),DNS需要解析到CDN的ip上去,在请求uri时,数据包就会先经过云waf进行检测,如果通过再将数据包流给主机。
2.主机防护软件:
在主机上预先安装了这种防护软件,可用于扫描和保护主机(废话),和监听web端口的流量是否有恶意的,所以这种从功能上讲较为全面。这里再插一嘴,mod_security、ngx-lua-waf这类开源waf虽然看起来不错,但是有个弱点就是升级的成本会高一些。
3.硬件ips/ids防护、硬件waf(这里先不讲)
使用专门硬件防护设备的方式,当向主机请求时,会先将流量经过此设备进行流量清洗和拦截,如果通过再将数据包流给主机。
再来说明下某些潜规则(关系):
百度云加速免费版节点基于CloudFlare
安全宝和百度云加速规则库相似
创宇云安全和腾讯云安全规则库相似
腾讯云安全和门神规则库相似
硬件waf自身漏洞往往一大堆
当Rule相似时,会导致一个问题,就比如和双胞胎结婚晓得吧?嗯。
3.司空见惯
我们还需要把各种特性都记牢,在运用时加以变化会很有效果。
数据库特性:1.注释,2.科学记数法,3.空白字符,4.+符号,5.-符号,6.``符号,7.~符号,8.!符号,9.@`形式`,10..1(点号1),11.'"(单双引符号),12.(select 1)(括号select1),13.{}符号,14.%符号,15.%u符号,16.畸形协议+请求,17.HPP,18.双重编码。
1.注释
#
--
-- -
--+
//
/**/
/*letmetest*/
;
利用注释简单绕过云锁的一个案例:
拦截的,但/**/ > 1个就可以绕过了,也就是/**//**/以上都可以。
2.科学记数法
3.空白字符
SQLite3 0A 0D 0C 09 20
MySQL5 09 0A 0B 0C 0D A0 20
PosgresSQL 0A 0D 0C 09 20
Oracle 11g 00 0A 0D 0C 09 20
MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
4.+符号
5.-符号
6.``符号
7.~符号
8.!符号
9.@`形式`
10..1(点号1)
11.'"(单双引符号)
12.(select 1)(括号select1)
13.{}符号
14.%符号
asp+iis的环境中,当我们请求的url中存在单一的百分号%时,iis+asp会将其忽略掉,而没特殊要求的waf当然是不会的
15.%u符号
iis支持unicode的解析,当我们请求的url存在unicode字符串的话iis会自动将其转换,但waf就不一定了
16.畸形协议+请求
asp/asp.net:还有asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式,不管是GET还是POST,都可正常接收,过滤GET请求时如果没有对application/x-www-form-urlencoded提交数据方式进行过滤,就会导致任意注入。
php+Apache:waf通常会对请求进行严格的协议判断,比如GET、POST等,但是apache解析协议时却没有那么严格,当我们将协议随便定义时也是可以的。
PHP解析器在解析multipart请求的时候,它以逗号作为边界,只取boundary,而普通解析器接受整个字符串。 因此,如果没有按正确规范的话,就会出现这么一个状况:首先填充无害的data,waf将其视为了一个整体请求,其实还包含着恶意语句。
------,xxxx
Content-Disposition: form-data; name="img"; filename="img.gif"
GIF89a
------
Content-Disposition: form-data; name="id"
1' union select null,null,flag,null from flag limit 1 offset 1-- -
--------
------,xxxx--
17.HPP
HPP是指HTTP参数污染-HTTP Parameter Pollution。当查询字符串多次出现同一个key时,根据容器不同会得到不同的结果,假设提交的参数即为:
id=1&id=2&id=3
asp.net + iis:id=1,2,3
asp + iis:id=1,2,3
php + apache:id=3
18.双重编码
这个要视场景而定,如果确定一个带有waf的site存在解码后注入的漏洞的话,会有效避过waf。
unlencode,base64,json,binary,querystring,htmlencode,unicode,php serialize
我们在整体测试一个waf时,可测试的点都有哪些?
GET,POST,HEADER,那么我们专门针对一个waf进行测试的时候就要将这几个点全测试个遍,header中还包括Cookie、X-Forwarded-For等,往往除了GET以外其他都是过滤最弱的。