Loading...
Loading...
Compare original and translation side by side
AI LOAD INSTRUCTION: Model the full request path: browser → CDN/WAF → reverse proxy → app framework → business code. Duplicate keys () are not an error at HTTP level; each hop may pick first, last, join, or array-ify. Test HPP when WAF and app disagree, or when internal HTTP clients rebuild query strings. 中文路由:同一参数名出现多次、或 WAF/后端技术栈不一致时,按 Section 1 矩阵选「先/后/合并」假设,再设计 Section 3 场景链。a=1&a=2
AI加载说明:对完整请求路径建模:浏览器 → CDN/WAF → 反向代理 → 应用框架 → 业务代码。重复键()在HTTP层面不属于错误;每一跳可能选择第一个、最后一个、拼接或者转为数组。当WAF和应用解析不一致,或者内部HTTP客户端重建查询字符串时测试HPP。中文路由:同一参数名出现多次、或WAF/后端技术栈不一致时,按第1节矩阵选「先/后/合并」假设,再设计第3节场景链。a=1&a=2
id=1&id=2
id=1&id=1%20OR%201=1
url=https://legit.example&id=https://evil.example
amount=1&amount=9999
csrf=TOKEN_A&csrf=TOKEN_B
user=alice&user=adminid=1&id=2
id=1&id=1%20OR%201=1
url=https://legit.example&id=https://evil.example
amount=1&amount=9999
csrf=TOKEN_A&csrf=TOKEN_B
user=alice&user=adminapplication/x-www-form-urlencoded
id=1&id=2
multipart/form-data
------boundary
Content-Disposition: form-data; name="id"
1
------boundary
Content-Disposition: form-data; name="id"
2application/x-www-form-urlencoded
id=1&id=2
multipart/form-data
------boundary
Content-Disposition: form-data; name="id"
1
------boundary
Content-Disposition: form-data; name="id"
2a=1&a=2a=1&a=2a=2&a=1a=1&a=2a=1&a=2a=2&a=1| Technology | Behavior | Example: |
|---|---|---|
PHP / Apache ( | Last occurrence | |
| ASP.NET / IIS | Often comma-joined (all) | |
| JSP / Tomcat (servlet param) | First occurrence | |
Python / Django ( | Last occurrence | |
Python / Flask ( | First occurrence | |
Node.js / Express ( | Array of values | |
| Perl / CGI | First occurrence | |
| Ruby / Rack (Rack::Utils) | Last occurrence | |
Go | First occurrence | |
1,22| 技术栈 | 行为 | 示例: |
|---|---|---|
PHP / Apache ( | 取最后一个出现的值 | |
| ASP.NET / IIS | 通常用逗号拼接所有值 | |
| JSP / Tomcat (servlet param) | 取第一个出现的值 | |
Python / Django ( | 取最后一个出现的值 | |
Python / Flask ( | 取第一个出现的值 | |
Node.js / Express ( | 转为值数组 | |
| Perl / CGI | 取第一个出现的值 | |
| Ruby / Rack (Rack::Utils) | 取最后一个出现的值 | |
Go | 取第一个出现的值 | |
1,22GET /api?q=safe&q=evil HTTP/1.1GET /api?q=safe&q=evil HTTP/1.1GET /api?id[]=1&id[]=2 HTTP/1.1GET /api?id[]=1&id[]=2 HTTP/1.1GET /api?item[]=a&item=b HTTP/1.1GET /api?item[]=a&item=b HTTP/1.1undefinedundefinedundefinedundefinedGET /api?user[name]=a&user[role]=user&user[role]=admin HTTP/1.1GET /api?user[name]=a&user[role]=user&user[role]=admin HTTP/1.1{"test":"user","test":"admin"}JSON.parse{"test":"user","test":"admin"}JSON.parseid=1&id=1%20UNION%20SELECT%20...id=1&id=1%20UNION%20SELECT%20...url=https://allowed.cdn.example/&url=http://169.254.169.254/url=https://allowed.cdn.example/&url=http://169.254.169.254/csrf=LEGIT&csrf=IGNORED_OR_ALTcsrf=LEGIT&csrf=IGNORED_OR_ALTamount=1&amount=5000
quantity=1&quantity=-1
price=9.99&price=0.01amount=1&amount=5000
quantity=1&quantity=-1
price=9.99&price=0.01| Tool | How to use |
|---|---|
| Burp Suite | Repeater: duplicate keys in raw query/body; Param Miner / extensions for hidden params; compare responses for |
| OWASP ZAP | Manual Request Editor; Automated Scan may not deeply fuzz HPP — prefer manual variants |
| Custom scripts | Build exact raw HTTP (preserve ordering) — some clients normalize duplicates |
| 工具 | 使用方法 |
|---|---|
| Burp Suite | 重放器:在原始查询/请求体中复制重复键;用Param Miner/扩展查找隐藏参数;对比响应判断是「取第一个」还是「取最后一个」的解析逻辑 |
| OWASP ZAP | 手动请求编辑器;自动扫描可能不会深度模糊测试HPP——优先手动测试变体 |
| 自定义脚本 | 构建完全原始的HTTP请求(保留顺序)——部分客户端会自动归一化重复参数 |
+-------------------------+
| Duplicate param name |
| same request |
+------------+------------+
|
+------------------+------------------+
| |
+------v------+ +------v------+
| Single app | | WAF / CDN / |
| layer only | | proxy chain |
+------+------+ +------+------+
| |
+---------v---------+ +---------v---------+
| Read framework | | Map each hop: |
| docs + test | | first/last/join/ |
| a=1&a=2 vs swap | | array |
+---------+---------+ +---------+---------+
| |
+------------------+------------------+
|
+------v------+
| Pick attack |
| template |
+------+------+
|
+-----------+-----------+-----------+-----------+
| | | | |
+----v----+ +----v----+ +----v----+ +----v----+ +----v----+
| WAF vs | | SSRF | | CSRF | | Logic | | JSON |
| app | | split | | token | | numeric | | dup key |
| value | | URL | | confuse | | fields | | parsers |
+---------+ +---------+ +---------+ +---------+ +---------+ +-------------------------+
| 同请求内存在重复参数名 |
+------------+------------+
|
+------------------+------------------+
| |
+------v------+ +------v------+
| 仅单个应用层 | | 存在WAF/CDN/ |
| | | 代理链路 |
+------+------+ +------+------+
| |
+---------v---------+ +---------v---------+
| 查阅框架文档+测试 | | 映射每一跳的解析逻辑:|
| a=1&a=2 和交换顺序的结果 | | 取首/取尾/拼接/转数组 |
+---------+---------+ +---------+---------+
| |
+------------------+------------------+
|
+------v------+
| 选择攻击模板 |
+------+------+
|
+-----------+-----------+-----------+-----------+
| | | | |
+----v----+ +----v----+ +----v----+ +----v----+ +----v----+
| WAF与应用 | | SSRF | | CSRF | | 业务逻辑 | | JSON |
| 值解析差异 | | URL拆分 | | 令牌混淆 | | 数值字段 | | 重复键解析 |
+---------+ +---------+ +---------+ +---------+ +---------+