HTTP 参数污染是什么
HTTP 参数污染(HPP)指同一个参数名在一次请求里重复出现,而链路各环节的取值策略并不一致:反向代理与 WAF 常取第一个,Java Servlet 容器取第一个,PHP 与部分 Node 框架取最后一个,还有的框架把它读成数组。结果是校验组件看到的值与业务真正使用的值可能不是同一个,出现「校验通过、执行越权」的错位。典型表现是权限判断读第一个参数、实际查询用最后一个。OWASP WSTG 把它列为独立测试项,CWE-235 描述为参数重复处理不当。
基本信息
| 注入位置 | 查询串、表单体、请求头三类均可重复同名参数 |
|---|---|
| 本质 | 各环节取值策略不一致导致的校验与使用错位 |
| 关注点 | 风控、越权判断、缓存键与日志记录取值差异 |
| 修复方向 | 入参唯一化,显式声明取值规则并统一解析 |
典型使用场景
- 越权查询:接口按 ID 取数据,权限校验与数据库查询取了不同值
- 风控绕过:风控读第一个手机号,业务发短信用最后一个
- 价格与数量篡改:结算取最后一个参数,风控只看第一个
- 缓存投毒:缓存键按整串 URL,回源按生效值,出现串号
- 日志取证失真:审计记录的值与实际生效值不符,追溯失效
验证步骤
验证步骤
1. 选带校验的接口,如按 ID 查询、与权限或金额相关的参数
2. 重复提交同名参数取不同值,例如 id=自己的id 与 id=他人id 同时出现
3. 对比观察:校验组件使用的值 与 业务实际生效的值
4. 换位置复测:查询串、表单体、请求头各试一次 # 三者取值策略常不同
5. 记录参数名、生效规则与偏差方向各环节取值差异
| 链路环节 | 常见取值策略 | 错位后果 |
|---|---|---|
| 反向代理与 WAF | 取第一个值 | 校验的是无害值,危险值继续下沉 |
| Java Servlet 容器 | 取第一个值 | 与部分框架预期不一致时判定失真 |
| PHP 与部分 Node 框架 | 取最后一个值 | 危险值逃过上游校验 |
| 部分框架参数数组 | 合并为集合 | 判定逻辑收到非预期结构而放行 |
| 缓存与日志组件 | 按原串或首个值处理 | 缓存串号、审计记录与事实不符 |
修复视角:在框架层统一参数解析策略,关键参数的校验与使用必须取自同一处已规范化后的值;对不接受重复的参数直接拒绝请求。