Parameter Pollution | JSON Injection
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术: HackTricks 培训 GCP 红队专家 (GRTE)
HTTP Parameter Pollution (HPP) 是一种技术,攻击者通过操纵 HTTP 参数以意想不到的方式改变 Web 应用程序的行为。这种操纵是通过添加、修改或重复 HTTP 参数来完成的。这些操纵的效果对用户并不直接可见,但可以显著改变应用程序在服务器端的功能,并在客户端产生可观察的影响。
一个银行应用程序的交易 URL:
原始 URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
通过插入一个额外的 from
参数:
操纵后的 URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
交易可能错误地从 accountC
而不是 accountA
收取,展示了 HPP 操纵交易或其他功能(如密码重置、2FA 设置或 API 密钥请求)的潜力。
参数的解析和优先级取决于底层 Web 技术,影响 HPP 的利用方式。
像 Wappalyzer 这样的工具有助于识别这些技术及其解析行为。
OTP 操纵案例:
背景: 一个需要一次性密码 (OTP) 的登录机制被利用。
方法: 通过使用 Burp Suite 等工具拦截 OTP 请求,攻击者在 HTTP 请求中重复了 email
参数。
结果: 本应发送到初始电子邮件的 OTP 被发送到操纵请求中指定的第二个电子邮件地址。这个缺陷允许通过绕过预期的安全措施获得未授权访问。
这个场景突显了应用程序后端的一个关键疏漏,它处理了第一个 email
参数用于 OTP 生成,但使用最后一个进行发送。
API 密钥操纵案例:
场景: 一个应用程序允许用户通过个人资料设置页面更新他们的 API 密钥。
攻击向量: 攻击者发现通过向 POST 请求附加一个额外的 api_key
参数,可以操纵 API 密钥更新功能的结果。
技术: 利用像 Burp Suite 这样的工具,攻击者构造一个请求,其中包含两个 api_key
参数:一个合法的和一个恶意的。服务器只处理最后一个出现的参数,将 API 密钥更新为攻击者提供的值。
结果: 攻击者控制了受害者的 API 功能,可能未经授权访问或修改私有数据。
这个例子进一步强调了安全参数处理的必要性,特别是在像 API 密钥管理这样关键的功能中。
Web 技术处理重复 HTTP 参数的方式各不相同,影响其对 HPP 攻击的易受性:
Flask: 采用遇到的第一个参数值,例如在查询字符串 a=1&a=2
中优先考虑初始实例而非后续重复。
PHP(在 Apache HTTP 服务器上): 相反,优先考虑最后一个参数值,在给定示例中选择 a=2
。这种行为可能无意中通过优先考虑攻击者操纵的参数而促进 HPP 利用。
结果来自 https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
忽略参数名称中的 %00 之后的内容。
将 name[] 视为数组。
_GET 不代表 GET 方法。
优先考虑最后一个参数。
使用 & 和 ; 分隔符来分割参数。
不识别 name[]。
优先考虑第一个参数。
POST RequestMapping == PostMapping & GET RequestMapping == GetMapping。
POST RequestMapping & PostMapping 识别 name[]。
如果 name 和 name[] 同时存在,优先考虑 name。
连接参数,例如 first,last。
POST RequestMapping & PostMapping 识别带有 Content-Type 的查询参数。
识别 name[]。
连接参数,例如 first,last。
不识别 name[]。
优先考虑第一个参数。
不识别 name[]。
优先考虑第一个参数。
不识别 name[]。
优先考虑最后一个参数。
不识别 name[]。
优先考虑最后一个参数。
前端可能会相信第一个出现,而后端使用的是键的第二个出现。
某些字符在前端可能无法被正确解析,但后端会解析它们并使用这些键,这可能有助于绕过某些限制:
注意在这些情况下,前端可能认为 test == 1
,而后端则认为 test == 2
。
这也可以用来绕过值限制,例如:
在这里,我们将使用每个解析器的序列化器来查看其各自的输出。
序列化器 1(例如,GoLang 的 GoJay 库)将产生:
description = "Duplicate with comments"
test = 2
extra = ""
序列化器 2(例如,Java 的 JSON-iterator 库)将产生:
description = "Duplicate with comments"
extra = "/*"
extra2 = "*/"
test = 1
或者,直接使用注释也可以有效:
Java的GSON库:
Ruby的simdjson库:
数字
可以解码为多种表示形式,包括:
可能会导致不一致
学习与实践 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习与实践 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)