利用 multipart boundary 绕过 WAF

0x00 前言 WAF(Web Application Firewall)是很常见的 Web 安全基础设施,许多云厂商、大厂、乙方安全公司均有相应的产品。然而,不得不承认,WAF 只能有限提升安全防护能力,不能拦截一些稍微复杂的攻击。正常业务不应当过度依赖 WAF,况且 WAF 还存在误拦截正常业务流量的可能。 目前已知的一些绕过 WAF 的手段包括但不限于: Chunked encoding 绕过 IBM037 等罕见编码绕过 多嘴一句:最早提出 IBM037 编码绕过 WAF 的应该是 Soroush Dalili 在 SteelCon 2017 上的议题,然而国内众多相关文章,基本没有标记出处,很奇怪。 笔者最近在分析 Go 语言的 HTTP 协议解析实现的时候,发现了一种能够利用 multipart boundary 绕过 WAF 的方法,在 Python 的一些 Web 框架上也适用,因而将其分享出来。 0x01 绕过 multipart/form-data 是一种非常常见的 HTML 表单编码方式,绝大部分的 Web 服务器、框架实现,均支持此编码。其编码后的请求大致如下所示,表单数据通过boundary分割。 POST /test HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=“boundary” —boundary Content-Disposition: form-data; name=“field1” value1 —boundary Content-Disposition: form-data; name=“field2”; filename=“example.txt” value2 —boundary— 那么只要满足上述协议要求,服务端就可以正常获取到字段内容了,如下图所示。 ...

August 2, 2021 · 1 min · 182 words · SYM01