HTTP 参数污染 (HTTP Parameter Pollution)
HTTP 参数污染 (HPP) 是一种 Web 攻击规避技术,攻击者可以借此构建 HTTP 请求,以操纵 Web 逻辑或检索隐藏信息。这种规避技术基于将攻击向量拆分到多个同名参数中(例如
?param1=value¶m1=value)。由于解析 HTTP 参数没有正式的标准,不同的 Web 技术在解析和读取同名 URL 参数时有各自独特的方式:有的取首个参数,有的取末尾参数,有的则将其读取为数组。攻击者利用这种行为来绕过基于模式匹配的安全机制。
摘要 (Summary)
工具 (Tools)
- Burp Suite: 手动修改请求以测试重复参数。
- OWASP ZAP: 拦截并操纵 HTTP 参数。
方法论 (Methodology)
HTTP 参数污染 (HPP) 是指攻击者在请求中注入多个同名 HTTP 参数的 Web 安全漏洞。服务器在处理重复参数时的行为各不相同,这可能导致意外或可利用的行为。
HPP 可以针对两个层面:
- 客户端 HPP:利用浏览器中运行的 JavaScript 代码。
- 服务端 HPP:利用服务器处理多个同名参数的方式。
示例:
参数污染解析表 (Parameter Pollution Table)
当请求为 ?par1=a&par1=b 时:
| 技术 | 解析结果 | 最终结果 (par1=) |
|---|---|---|
| ASP.NET/IIS | 所有出现的值 | a,b |
| ASP/IIS | 所有出现的值 | a,b |
Golang net/http - r.URL.Query().Get("param") |
首次出现的值 | a |
Golang net/http - r.URL.Query()["param"] |
数组形式的所有值 | ['a','b'] |
| IBM HTTP Server | 首次出现的值 | a |
| IBM Lotus Domino | 首次出现的值 | a |
| JSP,Servlet/Tomcat | 首次出现的值 | a |
| mod_wsgi (Python)/Apache | 首次出现的值 | a |
| Nodejs | 所有出现的值 | a,b |
| Perl CGI/Apache | 首次出现的值 | a |
| PHP/Apache | 最后出现的值 | b |
| PHP/Zues | 最后出现的值 | b |
| Python Django | 最后出现的值 | b |
| Python Flask | 首次出现的值 | a |
| Python/Zope | 数组形式的所有值 | ['a','b'] |
| Ruby on Rails | 最后出现的值 | b |
参数污染 Payload (Parameter Pollution Payloads)
-
重复参数:
-
数组注入:
-
编码注入:
-
嵌套注入:
-
JSON 注入: