1、免责声明
本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途
2、内容速览
定义:web应用防火墙(Web Application Firewall),通过执行一系列针对HTTP/HTTPS的安全策略来防御对web应用的攻击。
在测试的过程中我们要知道WAF一般主要是部署在那个节点,这对我们绕过WAF时有很大帮助。通过下图我们可以大概了解:
在我自己看来,所谓的BYPASS WAF实际上是去寻找位于WAF设备之后处理应用层数据包的硬件/软件的特性。利用特性构造WAF不能命中,但是在应用程序能够执行成功的载荷,绕过防护。
那些特性就像是一个个特定的场景一样,一些是已经被研究人员发现的,一些是还没被发现,等待被研究人员发现的。当我们的程序满足了这一个个的场景,倘若WAF没有考虑到这些场景,我们就可以利用这些特性bypass掉WAF了。
由于各个层面可以利用的特性很多,而且WAF往往要考虑自身的性能等等方面,导致了WAF往往会留下一些软肋。
在现实的测试过程中会遇到许多在进行几次操作后被封IP的情况。其主要是:
根据WAF返回结果
替换关键字:大小写、/**/替换空格、替换语句。
代理模式
使用垃圾数据等高并发流量,导致设备切换Bypass
IPS模式
分片问题:巨大的Content-Length导致设备Bypass、解码较弱。
GET /index.php?id=’an\d''=' HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
在某些业务中,一些字符会被替换成空(如很多利用json来传递数据的网站很多会把凡斜杠\替换成空,这种则可以利用burpsuit进行fuzzing查找被处理掉的字符),利用这个就可以用来绕过waf:’an\d‘’=‘会变成’and‘’=’,导致waf绕过.
GET /index.php?id='a%efnd''=' HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
测试%[80-ff]都可以,具体可以fuzzing来查找
POST /index.php HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: multipart/form-data; boundary=--------1099641188
Content-Length: 101
----------1099641188
Content-Disposition: form-data; name=“id;filename=xx”;name=“id”
'and''=‘
----------1099641188--
有些waf检测filename这个属性存在的时候下面的内容则不进行sql注入检测,因此可以构造同名参数前面一个name包含filename这个属性,后面再加一个正常的name属性,但是apache解析的时候会解析后面那个name属性,从而导致waf绕过。
特性就像是一个个特定的场景一样,一些是已经被研究人员发现的,一些是还没被发现,等待被研究人员发现的。
随着一个个特性的发现,WAF的防护能力在web对抗中逐渐增强,在我看来,当所有的特性场景均被WAF考虑到的时候,势必就会有的新的发现。
因此我们不用担心当所有的特性被WAF考虑到的时候我们无计可施,未知的特性那么多,我们还有很多地方可以去挖掘。
当你发现这些姿势都不好使的时候,你就该去发现一些新的特性了,毕竟设计WAF的选手都是基于目前的认知下去设计的,当新的特性出现的时候,势必又是一波bypass。
这个主要是对于waf检测文件后缀的时候起作用,利用超长的文件名,可以逃过文件后缀名的检测
上传一个比较大的文件,将马子藏在其中
简而言之,就是给参数赋上多个值
还是基于waf的检测一般都会判断请求类型再去检测内容
有些可以通过修改POST为GET绕过waf
还有的waf通过Content-Type: multipart/form-data来判定这是个上传包,然后检测内容
这个方法,又能细分出很多来,而且屡试不爽,这里总结下我个人常用的
(1) 删掉content-type
(2) 构造多个filename
(3)content-type后面加TABLE键
(4)换行boundary
(5)文件名前面加空格
(6)文件名前面加单引号
..................................这里是实在是太多了,就不一一举例了
这个就比较考验个人能力了,既可以让waf检测不到,有能成功执行命令,这里是真正的硬实力绕waf。