一、WAF绕过
1、脏数据绕过
即传入一段长数据使waf失效,从而实现绕过waf。某些waf处理POST的数据时,只会检测开头的8K,后面选择全部放过。
例如,当发现某网站存在一个反序列化漏洞时,但是无回显,被waf拦截了
利用脏数据插入5000个x字符,可以成功绕过。
2、高并发绕过
对请求进行并发,攻击请求会被负载均衡调度到不同节点,导致某些请求绕过了waf的拦截
3、http参数污染
在 php 语言中 id=1&id=2 后面的值会自动覆盖前面的值,不同的语言有不同的特性。可以利用这点绕过一 些 waf 的拦截。
4、数据格式混淆
利用数据格式解析缺陷,存在两种提交表单数据的请求类型
application/x-www-form-urlencoded
multipart/form-data 支持key-Value方式
可以修改提交格式
这两种方式提交数据的效果是一样的。
当然,除了这种方式外一些其他方式也可能绕过waf,例如将传入json数据,将其修改为HTTP请求,或者修改content-type等方式(当然是在应用能够正常解析的前提下)
5、编码绕过
对请求数据进行编码,例如url编码,Unicode编码等,如果waf对数据不能有效的解码,而应用后端能够正常解码,就可以绕过waf。
例如最常见的url编码,对数据进行二次url编码,waf进行一次解码并不能解析到有效的数据,而后端在进行解码时传入的为有效的恶意数据。
6、利用http协议绕过waf
6.1 分块传输绕过waf
- 先在数据包中添加Transfer-Encoding: chunked
- 数字代表下一列字符所占位数,最后需要用0独占一行表示结束,结尾需要两个回车
在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。
注意:分块编码传输需要将关键字and,or,select ,union等关键字拆开编码,不然仍然会被waf拦截。编码过程中长度需包括空格的长度。最后用0表示