Parameter Pollution | JSON Injection

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).

Support HackTricks

HTTP Parameter Pollution (HPP) Überblick

HTTP Parameter Pollution (HPP) ist eine Technik, bei der Angreifer HTTP-Parameter manipulieren, um das Verhalten einer Webanwendung auf unerwartete Weise zu ändern. Diese Manipulation erfolgt durch Hinzufügen, Ändern oder Duplizieren von HTTP-Parametern. Die Auswirkungen dieser Manipulationen sind für den Benutzer nicht direkt sichtbar, können jedoch die Funktionalität der Anwendung auf der Serverseite erheblich verändern und auf der Clientseite beobachtbare Effekte haben.

Beispiel für HTTP Parameter Pollution (HPP)

Eine URL für eine Banktransaktion:

  • Original URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000

Durch Einfügen eines zusätzlichen from-Parameters:

  • Manipulierte URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC

Die Transaktion könnte fälschlicherweise accountC belastet werden anstatt accountA, was das Potenzial von HPP zeigt, Transaktionen oder andere Funktionalitäten wie Passwort-Resets, 2FA-Einstellungen oder API-Key-Anfragen zu manipulieren.

Technology-Specific Parameter Parsing

  • Die Art und Weise, wie Parameter geparst und priorisiert werden, hängt von der zugrunde liegenden Webtechnologie ab und beeinflusst, wie HPP ausgenutzt werden kann.
  • Tools wie Wappalyzer helfen dabei, diese Technologien und ihr Parsing-Verhalten zu identifizieren.

PHP und HPP-Ausnutzung

OTP-Manipulationsfall:

  • Kontext: Ein Login-Mechanismus, der ein One-Time Password (OTP) erfordert, wurde ausgenutzt.
  • Methode: Durch Abfangen der OTP-Anfrage mit Tools wie Burp Suite duplizierten Angreifer den email-Parameter in der HTTP-Anfrage.
  • Ergebnis: Das OTP, das für die ursprüngliche E-Mail gedacht war, wurde stattdessen an die zweite E-Mail-Adresse in der manipulierten Anfrage gesendet. Dieser Fehler erlaubte unautorisierten Zugriff, indem die beabsichtigte Sicherheitsmaßnahme umgangen wurde.

Dieses Szenario hebt einen kritischen Fehler im Backend der Anwendung hervor, das den ersten email-Parameter zur OTP-Erzeugung verarbeitete, aber den letzten zur Zustellung verwendete.

API Key Manipulationsfall:

  • Szenario: Eine Anwendung erlaubt es Benutzern, ihren API Key über eine Profil-Einstellungsseite zu aktualisieren.
  • Angriffsvektor: Ein Angreifer stellt fest, dass er durch Anhängen eines zusätzlichen api_key-Parameters an die POST-Anfrage das Ergebnis der API-Key-Aktualisierungsfunktion beeinflussen kann.
  • Technik: Mit einem Tool wie Burp Suite erstellt der Angreifer eine Anfrage, die zwei api_key-Parameter enthält: einen legitimen und einen bösartigen. Der Server, der nur das letzte Vorkommen verarbeitet, aktualisiert den API Key auf den vom Angreifer angegebenen Wert.
  • Resultat: Der Angreifer erlangt Kontrolle über die API-Funktionalität des Opfers und kann möglicherweise private Daten unautorisiert zugreifen oder verändern.

Dieses Beispiel unterstreicht die Notwendigkeit einer sicheren Parameterbehandlung, insbesondere bei so kritischen Funktionen wie der Verwaltung von API Keys.

Parameter Parsing: Flask vs. PHP

Die Art und Weise, wie Webtechnologien doppelte HTTP-Parameter handhaben, variiert und beeinflusst ihre Anfälligkeit für HPP-Angriffe:

  • Flask: Nimmt den zuerst vorkommenden Parameterwert, z. B. a=1 in einer Query-String a=1&a=2, und priorisiert die erste Instanz gegenüber nachfolgenden Duplikaten.
  • PHP (on Apache HTTP Server): Priorisiert hingegen den letzten Parameterwert und entscheidet sich in dem gegebenen Beispiel für a=2. Dieses Verhalten kann unbeabsichtigt HPP-Exploits erleichtern, indem es den vom Angreifer manipulierten Parameter gegenüber dem ursprünglichen bevorzugt.

HPP-Testhinweise (OWASP WSTG)

  • HTTP-Standards definieren nicht, wie mehrere Parameter mit demselben Namen zu interpretieren sind, daher variiert das Verhalten über Stacks und Komponenten hinweg.
  • Beim Testen von serverseitigem HPP duplizieren Sie jeden Parameter in Query-Strings oder Bodies und beobachten, ob die Anwendung Werte verkettet, den ersten/letzten verwendet oder Fehler produziert.
  • Für client-seitiges HPP injizieren Sie ein URL-encodiertes & in einen reflektierten Parameterwert (z. B. %26HPP_TEST) und suchen nach dekodierten Vorkommen wie &HPP_TEST oder &HPP_TEST in generierten Links oder form actions.

Server-Side Parameter Pollution (SSPP) in internen APIs

Einige Anwendungen betten Benutzereingaben in serverseitige Anfragen an interne APIs ein. Wenn diese Eingaben nicht korrekt enkodiert sind, können Sie Parameter in der internen Anfrage injizieren oder überschreiben. Testen Sie jede Benutzereingabe, einschließlich Query-Parameter, Formularfelder, Header und URL-Path-Parameter.

Gängige Probes:

  • Fügen Sie einen neuen Parameter mit %26 (URL-encodiertes &) hinzu.
  • Trunkieren Sie die nachgelagerte Query mit %23 (URL-encodiertes #).
  • Überschreiben Sie einen vorhandenen Parameter durch Duplizieren.

Beispiel:

GET /userSearch?name=peter%26name=carlos&back=/home

Kann möglicherweise in eine serverseitige Anfrage wie folgt resultieren:

GET /users/search?name=peter&name=carlos&publicProfile=true

Parameter-Verschmutzung nach Technologie

Die Ergebnisse stammen aus https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89

PHP 8.3.11 UND Apache 2.4.62

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

  1. Ignoriere alles nach %00 im Parameternamen .
  2. Behandle name[] als Array .
  3. _GET bedeutet nicht die GET-Methode .
  4. Bevorzuge den letzten Parameter .

Ruby 3.3.5 UND WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

  1. Verwendet die & und ; Trennzeichen, um Parameter aufzuteilen .
  2. Erkennt name[] nicht .
  3. Bevorzuge den ersten Parameter .

Spring MVC 6.0.23 UND Apache Tomcat 10.1.30

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

  1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping .
  2. POST RequestMapping & PostMapping erkennen name[] .
  3. Bevorzuge name, wenn name UND name[] existieren .
  4. Verkettet Parameter z.B. first,last .
  5. POST RequestMapping & PostMapping erkennen Query-Parameter mit Content-Type .

NodeJS 20.17.0 UND Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

  1. Erkennt name[] .
  2. Verkettet Parameter z.B. first,last .

GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

  1. Erkennt name[] nicht .
  2. Bevorzuge den ersten Parameter .

Python 3.12.6 UND Werkzeug 3.0.4 UND Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

  1. Erkennt name[] nicht .
  2. Bevorzuge den ersten Parameter .

Python 3.12.6 UND Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

  1. Erkennt name[] nicht .
  2. Bevorzuge den letzten Parameter .

Python 3.12.6 UND Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

  1. Erkennt name[] nicht .
  2. Bevorzuge den letzten Parameter .

JSON Injection

JSON, XML and YAML Hacking

Doppelte Schlüssel

obj = {"test": "user", "test": "admin"}

Das front-end könnte dem ersten Vorkommen glauben, während das backend das zweite Vorkommen des Keys verwendet.

Key Collision: Character Truncation and Comments

Bestimmte Zeichen werden vom frontend nicht korrekt interpretiert, aber das backend wird sie interpretieren und diese Keys verwenden, das kann nützlich sein, um bestimmte Einschränkungen zu umgehen:

{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}

Beachte, wie in diesen Fällen das front end denken könnte, dass test == 1 und das backend denken wird, dass test == 2.

Dies kann auch verwendet werden, um Wertbeschränkungen wie folgt zu umgehen:

{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}

Verwendung von Comment Truncation

obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}

Hier verwenden wir den Serializer jedes Parsers, um dessen jeweilige Ausgabe zu sehen.

Serializer 1 (z. B. GoLang’s GoJay library) gibt aus:

  • description = "Duplicate with comments"
  • test = 2
  • extra = ""

Serializer 2 (z. B. Java’s JSON-iterator library) gibt aus:

  • description = "Duplicate with comments"
  • extra = "/*"
  • extra2 = "*/"
  • test = 1

Alternativ kann die einfache Verwendung von Kommentaren ebenfalls effektiv sein:

obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}

GSON-Bibliothek für Java:

{ "description": "Comment support", "test": 1, "extra": "a" }

Rubys simdjson-Bibliothek:

{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }

Inkonsistenter Vorrang: Deserialization vs. Serialization

obj = {"test": 1, "test": 2}

obj["test"] // 1
obj.toString() // {"test": 2}

Float and Integer

Die Zahl

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

kann in mehrere Repräsentationen decodiert werden, einschließlich:

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Was Inkonsistenzen verursachen könnte

Referenzen

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).

Support HackTricks