HTTP Parameter Pollution (HPP) - Parameter-Verschmutzung
HTTP Parameter Pollution sendet mehrfache gleichnamige Parameter um inkonsistente Backend-Verarbeitung auszunutzen. Angriffstechnik und Gegenmassnahmen.
Inhaltsverzeichnis (4 Abschnitte)
Kurzerklärung: HTTP Parameter Pollution tritt auf wenn mehrere gleichnamige Parameter in einer HTTP-Anfrage gesendet werden und Backend-Systeme diese unterschiedlich interpretieren. Angreifer können dadurch Validierungs-Logik umgehen, WAF-Regeln aushebeln und unerwartetes Verhalten auslöser. Betroffen: Parameterparsing in PHP (letzter Wert), ASP.NET (erster Wert), Node.js (Array) - die Inkonsistenz zwischen Komponenten wird ausgenutzt.
HTTP Parameter Pollution (HPP) entsteht durch eine Eigenheit des HTTP-Standards: Es gibt keine normative Spezifikation wie Webserver mit mehrfach vorkommenden Query- oder Body-Parametern gleichen Namens umgehen sollen. Verschiedene Technologien lösen das Problem unterschiedlich - und genau diese Inkonsistenz wird von Angreifern ausgenutzt.
Grundprinzip
Problem: Was passiert bei ?id=1&id=2 ?
| Technologie | Verhalten |
|---|---|
| PHP (Apache) | $_GET['id'] = "2" - letzter Wert gewinnt |
| ASP.NET (IIS) | Request["id"] = "1,2" - Komma-separierte Liste |
| JSP (Tomcat) | request.getParameter("id") = "1" - erster Wert gewinnt |
| Node.js (qs) | req.query.id = ["1", "2"] - Array |
| Flask (Python) | request.args.get("id") = "1" - erster Wert gewinnt |
| Flask (getlist) | request.args.getlist("id") = ["1", "2"] - explizit |
Die Inkonsistenz IST das Problem - nicht ein Bug in einer Komponente!
Typische HPP-Angriffsflächen:
- Query-Parameter in GET-Requests:
?role=user&role=admin - POST-Body-Parameter:
username=victim&username=attacker - HTTP-Header-Werte (seltener, aber möglich)
- JSON-Arrays in Request-Bodies (JSON HPP)
- SOAP-Envelopes mit duplizierten Elementen
HPP-Angriffsvektoren
Angriff 1 - WAF-Bypass:
WAF prüft auf SQL-Injection in Parametern:
/search?q=SELECT+*+FROM+users
WAF blockiert diesen Request. HPP-Bypass:
/search?q=SELECT+*&q=FROM+users
Die WAF prüft nur den ersten Parameter, das Backend konkateniert beide - Bypass! Oder:
/search?q=1' OR '1'='1
/search?q=1'&q=OR '1'='1
Die WAF sieht keinen vollständigen Payload, das Backend kombiniert beides - SQLi möglich!
Angriff 2 - Signaturprüfungs-Bypass:
Typisches sicheres API-Design (z.B. Zahlungs-API):
POST /transfer
Body: amount=100&to=alice&signature=HMAC(amount=100,to=alice)
HPP-Angriff:
POST /transfer
Body: amount=100&to=alice&signature=VALID_HASH&to=attacker
Die Signatur-Prüfung nimmt den ERSTEN to-Wert (alice, gültig), die Transfer-Logik nimmt den LETZTEN to-Wert (attacker, Angriff) - gültiger Transfer zu falschem Empfänger!
Angriff 3 - Zugriffskontroll-Bypass:
GET /api/order?user_id=123&status=pending
GET /api/order?user_id=123&user_id=456&status=pending
Wenn der Autorisierungs-Layer 123 prüft (erster Wert), die Daten-Query aber mit 456 läuft (letzter Wert) - IDOR! Fremde Bestellungen sind abrufbar.
Angriff 4 - Logik-Manipulation (Bestellprozess):
POST /checkout
Body: item_id=EXPENSIVE&coupon=INVALID&coupon=VALID50
Die Coupon-Validierung prüft den ersten Wert (INVALID, kein Rabatt geloggt), die Preis-Kalkulation nutzt den letzten Wert (VALID50, 50% Rabatt) - Rabatt ohne validierten Coupon!
Angriff 5 - Server-Side HPP (SSHPP):
Der Backend-Server aggregiert URLs für externe API-Calls. Der Angreifer übergibt &id=MALICIOUS&lang=en, woraus die vollständige URL wird:
https://api.intern/data?id=1&id=MALICIOUS&lang=en
Der interne Parameter wird überschrieben.
Erkennung im Pentest
1. Parameter-Identifikation
- Alle Parameter in GET, POST, Cookies, Headers auflisten
- Tipp: Burp Suite "Param Miner" Extension
2. Duplikations-Tests
Für jeden Parameter:
- Original:
?param=ORIGINAL - HPP-Test:
?param=ORIGINAL¶m=INJECTED - Reihenfolge umkehren:
?param=INJECTED¶m=ORIGINAL - Komma-Notation:
?param=ORIGINAL,INJECTED - Array-Notation:
?param[]=ORIGINAL¶m[]=INJECTED
3. Verhaltensanalyse
- Antwortet die App anders mit duplizierten Parametern?
- Welcher Wert wird tatsächlich verarbeitet?
- Gibt es Unterschiede zwischen Validierungs- und Verarbeitungsschicht?
4. WAF-Bypass-Test
- Bekannten WAF-Block erzeugen (einfache SQLi/XSS-Payload)
- Payload auf zwei Parameter aufteilen
- Verschiedene Kombinationen testen
- Auch Array-Syntax:
?q[]=SELECT&q[]=*
5. Automatisiert (Burp Active Scan)
- Parameter-Duplikation wird von Burp Pro erkannt
- "Passive Scans" zeigen oft HPP-Hinweise in Response-Differenzen
- HPP Finder Extension im BApp Store
6. JSON HPP
Testen: {"user": "alice", "user": "attacker"} - welche Implementierung nimmt welchen Wert? JavaScript-Parser: letzter Wert (meist). Gott-modus durch JSON-Duplikate prüfen.
Schutzmaßnahmen
1. Einheitliche Parameter-Extraktion
- NUR eine Methode zur Parameter-Extraktion verwenden
- Explizit entscheiden: erster oder letzter Wert?
- NIEMALS auf implizites Framework-Verhalten vertrauen!
Python (Flask) - sicher:
value = request.args.get('param') # erster Wert
values = request.args.getlist('param') # alle Werte
# Wenn getlist mehr als 1 Element → 400 Bad Request!
Node.js (Express) - sicher:
const param = req.query.param;
if (Array.isArray(param)) {
return res.status(400).json({ error: 'Duplicate parameter' });
}
2. Duplikat-Ablehnung
- Middleware die mehrfache Parameter blockiert
- 400 Bad Request bei Parameterduplikaten
Nginx (rudimentär):
if ($args ~* "(.+)=(.*)&\1=") {
return 400;
}
# Warnung: Regex-Performance prüfen!
3. Konsistenz zwischen Schichten
- Sicherheitsprüfung (WAF/Auth) und Applikation MÜSSEN gleiche Parameter-Semantik verwenden
- Single Source of Truth für Parameter-Parsing
- Selbe Library/Methode für WAF-Bypass-Prüfung und Business-Logik
4. Eingabe-Whitelisting
- Erwartete Parameter explizit definieren
- Unbekannte Parameter verwerfen (nicht ignorieren!)
- Parameteranzahl validieren: max. 1x pro bekanntem Namen
5. Signatur und Integritätsprüfung
- HMAC über exakt serialisierte Parameter berechnen
- Kanonische Serialisierung: alphabetisch sortierte Key=Value-Paare
- Signaturprüfung und Verarbeitung MÜSSEN selbe Canonical-Form nutzen
6. WAF-Konfiguration
- HPP-Erkennung im WAF aktivieren (ModSecurity: CRS HPP-Regeln)
- REQUEST_ARGS:duplikat-Regeln aktivieren
- Periodische Bypass-Tests gegen eigene WAF!
HPP ist eine der am häufigsten übersehenen Schwachstellenklassen - weil sie oft erst im Zusammenspiel mehrerer Komponenten entsteht. Besonders gefährlich sind SSHPP-Angriffe, bei denen ein Angreifer-kontrollierter Parameter interne API-Parameter überschreibt. AWARE7 überprüft HPP-Schwachstellen im Rahmen von Web Application Penetrationstests als Teil der Input-Validierungs-Tests.
Fragen zu diesem Thema?
Unsere Experten beraten Sie kostenlos und unverbindlich.
Über den Autor
Geschäftsführender Gesellschafter der AWARE7 GmbH mit langjähriger Expertise in Informationssicherheit, Penetrationstesting und IT-Risikomanagement. Absolvent des Masterstudiengangs Internet-Sicherheit an der Westfälischen Hochschule (if(is), Prof. Norbert Pohlmann). Bestseller-Autor im Wiley-VCH Verlag und Lehrbeauftragter der ASW-Akademie. Einschätzungen zu Cybersecurity und digitaler Souveränität erschienen u.a. in Welt am Sonntag, WDR, Deutschlandfunk und Handelsblatt.
10 Publikationen
- Einsatz von elektronischer Verschlüsselung - Hemmnisse für die Wirtschaft (2018)
- Kompass IT-Verschlüsselung - Orientierungshilfen für KMU (2018)
- IT Security Day 2025 - Live Hacking: KI in der Cybersicherheit (2025)
- Live Hacking - Credential Stuffing: Finanzrisiken jenseits Ransomware (2025)
- Keynote: Live Hacking Show - Ein Blick in die Welt der Cyberkriminalität (2025)
- Analyse von Angriffsflächen bei Shared-Hosting-Anbietern (2024)
- Gänsehaut garantiert: Die schaurigsten Funde aus dem Leben eines Pentesters (2022)
- IT Security Zertifizierungen - CISSP, T.I.S.P. & Co (Live-Webinar) (2023)
- Sicherheitsforum Online-Banking - Live Hacking (2021)
- Nipster im Netz und das Ende der Kreidezeit (2017)