HTTP 参数污染 HTTP 参数污染 (HPP) 是一种 Web 攻击规避技术,攻击者可以通过构造 HTTP 请求来操纵 Web 逻辑或获取隐藏信息。这种规避技术的核心在于将攻击向量拆分到多个同名参数实例中(?param1=value¶m1=value)。由于没有正式的 HTTP 参数解析方式,不同的 Web 技术在解析和读取同名 URL 参数时有着各自独特的处理方式:有的取第一个出现的值,有的取最后一个出现的值,还有的将其解析为数组。攻击者会利用这些行为差异来绕过基于模式的安全机制。 摘要 工具 方法论 参数污染表 参数污染载荷 参考文献 工具 Burp Suite: 手动修改请求以测试重复参数。 OWASP ZAP: 拦截并操作 HTTP 参数。
HTTP 参数污染 (HPP) 是一种 Web 攻击规避技术,攻击者可以通过构造 HTTP 请求来操纵 Web 逻辑或获取隐藏信息。这种规避技术的核心在于将攻击向量拆分到多个同名参数实例中(?param1=value¶m1=value)。由于没有正式的 HTTP 参数解析方式,不同的 Web 技术在解析和读取同名 URL 参数时有着各自独特的处理方式:有的取第一个出现的值,有的取最后一个出现的值,还有的将其解析为数组。攻击者会利用这些行为差异来绕过基于模式的安全机制。
HTTP 参数污染 (HPP) 是一种 Web 安全漏洞,攻击者可以在请求中注入多个相同 HTTP 参数的实例。服务器在处理重复参数时的行为可能各不相同,从而导致意外或可被利用的行为。
HPP 可以针对两个层面:
示例:
/app?debug=false&debug=true /transfer?amount=1&amount=5000
当 ?par1=a&par1=b 时
| 技术 | 解析结果 | 结果 (par1=) |
|---|---|---|
| ASP.NET/IIS | 所有出现的值 | a,b |
| ASP/IIS | 所有出现的值 | a,b |
Golang net/http - r.URL.Query().Get("param") |
First occurrence | 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 |
重复参数:
param=value1¶m=value2
数组注入:
param[]=value1 param[]=value1¶m[]=value2 param[]=value1¶m=value2 param=value1¶m[]=value2
编码注入:
param=value1%26other=value2
嵌套注入:
param[key1]=value1¶m[key2]=value2
JSON 注入:
{ "test": "user", "test": "admin" }
免责声明:
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。