跳转至

HTTP 参数污染 (HTTP Parameter Pollution)

HTTP 参数污染 (HPP) 是一种 Web 攻击规避技术,攻击者可以借此构建 HTTP 请求,以操纵 Web 逻辑或检索隐藏信息。这种规避技术基于将攻击向量拆分到多个同名参数中(例如 ?param1=value&param1=value)。由于解析 HTTP 参数没有正式的标准,不同的 Web 技术在解析和读取同名 URL 参数时有各自独特的方式:有的取首个参数,有的取末尾参数,有的则将其读取为数组。攻击者利用这种行为来绕过基于模式匹配的安全机制。

摘要 (Summary)

工具 (Tools)

  • Burp Suite: 手动修改请求以测试重复参数。
  • OWASP ZAP: 拦截并操纵 HTTP 参数。

方法论 (Methodology)

HTTP 参数污染 (HPP) 是指攻击者在请求中注入多个同名 HTTP 参数的 Web 安全漏洞。服务器在处理重复参数时的行为各不相同,这可能导致意外或可利用的行为。

HPP 可以针对两个层面:

  • 客户端 HPP:利用浏览器中运行的 JavaScript 代码。
  • 服务端 HPP:利用服务器处理多个同名参数的方式。

示例:

/app?debug=false&debug=true
/transfer?amount=1&amount=5000

参数污染解析表 (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)

  • 重复参数:

    param=value1&param=value2
    
  • 数组注入:

    param[]=value1
    param[]=value1&param[]=value2
    param[]=value1&param=value2
    param=value1&param[]=value2
    
  • 编码注入:

    param=value1%26other=value2
    
  • 嵌套注入:

    param[key1]=value1&param[key2]=value2
    
  • JSON 注入:

    {
        "test": "user",
        "test": "admin"
    }
    

参考资料 (References)