利用 Transfer-Encoding: Chunked 绕过 WAF 实战
来源:香依香偎@闻道解惑
找到一个部署了 WAF
的站点。先发一个报文,删除了 cookie
。
可以看到服务端返回了 403,证明请求已经到达服务端了。
接下来,在报文中增加无意义的 /etc/passwd
,触发 WAF
拦截规则。
无法收到响应,请求被 WAF
拦截。
现在我们看看怎么绕过WAF。bypassword
在 《在HTTP协议层面绕过WAF》 中提出了使用 Transfer-Encoding:chunked
来绕过 WAF
的方案,原理是将请求报文的body
部分切分成多份来绕过WAF规则。我们来试试。
上一个请求需要做三点改动:
- 请求的header部分,增加一个 “Tranfer-Encoding: chunked” 的 header
- 请求的body部分切成多份,每一份都是 “Length+换行+Value+换行” 的格式
- body部分的最后,增加 “0+空行+空行” 作为结束符
如下所示。
可以看到服务端返回了 403
,证明请求已经到达服务端了,顺利通过了 WAF
的检测。
360
的 luoye、00theway、zonadu
在《利用分块传输吊打所有WAF》 中提到了一个改进方案,就是在每个 Length
和 换行
之间,插入 “分号;”开头的任意注释,进一步混淆 WAF
的处理,就像这样。
手工切分 http body 太麻烦了,c0ny1
写了一个 BurpSuite
插件 来实现报文的自动切分,代码在 https://github.com/c0ny1/chunked-coding-converter。插件效果如下。