拜读了c0ny1大佬的文章《编写Burp分块传输插件绕WAF》,并且研究了该插件的使用。发现这款工具确实好用,waf多是基于关键字匹配检测,而chunked方式把数据分块,使得waf匹配不到对应关键字,从而达到绕过的效果。虽然没有试验,但是相信能绕过不少基于ModSecurity做的WAF产品。
分块传输原理图 by:M_ZPHr
1、该插件利用的请求是post方法
。如果是服务器是get方法的,需要把get请求改为post请求,同时要满足服务器能接受post请求并正确响应。
2、请求包中消息头带有Transfer-Encoding: chunked
,这是分块传输的标志。目前web应用很少能见到分块传输,更多的是断点续传,如果我们没有利用分块传输的web应用,而IDS、IPS或者流量分析系统检测到http请求头有“Transfer-Encoding: chunked”,则说明有人尝试利用分块传输发动攻击。
3、消息主体,其特征值是分块传输的规则
。基本格式是第一行表示下一行内容的长度,第二行则是内容,最末尾倒数第三行为0,然后最后两行为空行。所以要把传输的块拼接起来就是,偶数行拼接。而加入的注释干扰项是在表示下一行长度的这行尾部添加 ;(数字+字母大小写随机字符串)
。更详细的规则可以参考HTTP协议之chunk编码(分块传输编码) 和技术讨论 | 在HTTP协议层面绕过WAF。
以下是在dvwa中sql盲注的演示,payload为 1' and 1=2
原始请求:
更改为post型:
分块编码后(每块长度为5~10):
分块编码后(每块长度为1~5):