Was macht http-parameter-pollution?
HTTP-Parameter-Verschmutzung (HPP): Doppelte Query-/Body-Schlüssel werden von Servern, Proxys, WAFs und App-Frameworks unterschiedlich geparst. Einsetzbar, wenn Filter und Anwendungsschichten sich über den Gewinnerwert uneinig sind, was Umgehungen, SSRF-Zweit-URLs, Logikmissbrauch oder CSRF-Token-Verwirrung ermöglicht.
Überblick
HTTP-Parameter-Verschmutzung (HPP) tritt auf, wenn eine Webanwendung mehrere HTTP-Parameter mit demselben Namen akzeptiert und verarbeitet. Verschiedene Technologien (Server, Proxys, WAFs, Frameworks) haben unterschiedliche Regeln, welcher Parameterwert „gewinnt“. Diese Inkonsistenz kann ausgenutzt werden, um Sicherheitskontrollen zu umgehen.
Unterstützte Plattformen
- Yaklang: Native Unterstützung für HPP-Tests und Payload-Generierung
- Burp Suite: Manuelles Testen mit Repeater und Intruder
- curl: Schnelle Tests von der Kommandozeile
- Browser DevTools: Analyse von Anfragen und Parametern
Wie es funktioniert
- Identifizierung: Suchen Sie nach Endpunkten, die mehrere Parameter mit demselben Namen akzeptieren (z.B.
?id=1&id=2) - Analyse: Bestimmen Sie, welcher Wert von verschiedenen Komponenten priorisiert wird (erster, letzter, konkateniert)
- Ausnutzung: Erstellen Sie Payloads, die den gewünschten Wert (z.B. einen bösartigen) an die Anwendung übergeben, während der harmlose Wert die Filter passiert
Beispiele
Query-String HPP
GET /search?q=safe&q=malicious HTTP/1.1
Host: example.com
- Apache/PHP: Letzter Wert gewinnt →
malicious - ASP.NET/IIS: Alle Werte konkateniert →
safe,malicious - Tomcat: Erster Wert gewinnt →
safe
POST Body HPP
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
user=admin&pass=123&user=attacker&pass=456
- Python-Frameworks: Letzter Wert gewinnt →
user=attacker - Node.js (express): Erster Wert gewinnt →
user=admin
SSRF via HPP
Ein Endpunkt, der URLs akzeptiert, könnte durch HPP umgangen werden:
POST /proxy
Content-Type: application/x-www-form-urlencoded
url=safe.com&url=http://internal.local/admin
Testmethoden
- Manuelles Testen: Verwenden Sie curl oder Burp Suite, um wiederholte Parameter zu senden
- Automatisiertes Scanning: Yaklang-Skripte können verschiedene Parameterkombinationen testen
- Framework-spezifische Tests: Berücksichtigen Sie die Parsing-Logik des Ziel-Frameworks
Prävention
- Verwenden Sie eindeutige Parameternamen
- Validieren Sie Parameter vor der Verarbeitung
- Konsistente Parsing-Logik über alle Komponenten hinweg