Parameter Pollution | JSON Injection

Tip

Apprenez et pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Parcourez le catalogue complet de HackTricks Training pour les parcours d’évaluation (ARTA/GRTA/AzRTA) et Linux Hacking Expert (LHE).

Support HackTricks

HTTP Parameter Pollution (HPP) — Aperçu

HTTP Parameter Pollution (HPP) est une technique où les attaquants manipulent les paramètres HTTP pour modifier le comportement d’une application web de manière non prévue. Cette manipulation se fait en ajoutant, modifiant ou dupliquant des paramètres HTTP. L’effet de ces manipulations n’est pas directement visible par l’utilisateur mais peut altérer de façon significative la fonctionnalité de l’application côté serveur, avec des impacts observables côté client.

Exemple de HTTP Parameter Pollution (HPP)

A banking application transaction URL:

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

By inserting an additional from parameter:

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

The transaction may be incorrectly charged to accountC instead of accountA, showcasing the potential of HPP to manipulate transactions or other functionalities such as password resets, 2FA settings, or API key requests.

Interprétation des paramètres selon la technologie

  • La façon dont les paramètres sont interprétés et priorisés dépend de la technologie web sous-jacente, ce qui influence la manière dont HPP peut être exploité.
  • Tools like Wappalyzer help identify these technologies and their parsing behaviors.

Exploitation de HPP en PHP

OTP Manipulation Case:

  • Contexte : Un mécanisme de connexion nécessitant un One-Time Password (OTP) a été exploité.
  • Méthode : En interceptant la requête OTP avec des outils comme Burp Suite, les attaquants ont dupliqué le paramètre email dans la requête HTTP.
  • Résultat : L’OTP, destiné à l’email initial, a été envoyé à la place à la deuxième adresse email spécifiée dans la requête manipulée. Cette faille a permis un accès non autorisé en contournant la mesure de sécurité prévue.

Ce scénario met en évidence une lacune critique dans le backend de l’application, qui traitait le premier paramètre email pour la génération de l’OTP mais utilisait le dernier pour la livraison.

API Key Manipulation Case:

  • Scénario : Une application permet aux utilisateurs de mettre à jour leur API key via une page de paramètres de profil.
  • Vecteur d’attaque : Un attaquant découvre qu’en ajoutant un paramètre api_key supplémentaire à la requête POST, il peut manipuler le résultat de la fonction de mise à jour de l’API key.
  • Technique : En utilisant un outil comme Burp Suite, l’attaquant crée une requête contenant deux paramètres api_key : un légitime et un malveillant. Le serveur, ne traitant que la dernière occurrence, met à jour l’API key avec la valeur fournie par l’attaquant.
  • Résultat : L’attaquant prend le contrôle de la fonctionnalité API de la victime, pouvant potentiellement accéder ou modifier des données privées de manière non autorisée.

Cet exemple souligne encore la nécessité d’un traitement sécurisé des paramètres, en particulier pour des fonctionnalités aussi critiques que la gestion des API key.

Parsing des paramètres : Flask vs. PHP

La manière dont les technologies web traitent les paramètres HTTP dupliqués varie, influençant leur vulnérabilité aux attaques HPP :

  • Flask : Prend la première valeur du paramètre rencontrée, par exemple a=1 dans une query string a=1&a=2, privilégiant l’instance initiale par rapport aux occurrences ultérieures.
  • PHP (on Apache HTTP Server) : À l’inverse, privilégie la dernière valeur du paramètre, optant pour a=2 dans l’exemple. Ce comportement peut faciliter involontairement les exploits HPP en tenant compte du paramètre manipulé par l’attaquant plutôt que de l’original.

HPP Testing Notes (OWASP WSTG)

  • Les standards HTTP ne définissent pas comment interpréter plusieurs paramètres portant le même nom, donc le comportement varie selon les stacks et les composants.
  • Lors des tests HPP côté serveur, dupliquez chaque paramètre dans les query strings ou dans le corps et observez si l’application concatène les valeurs, utilise la première/dernière, ou génère une erreur.
  • Pour le HPP côté client, injectez un & encodé en URL dans une valeur de paramètre reflétée (par ex., %26HPP_TEST) et cherchez des occurrences décodées telles que &HPP_TEST ou &HPP_TEST à l’intérieur des liens générés ou des actions de formulaires.

Server-Side Parameter Pollution (SSPP) dans les API internes

Certaines applications intègrent l’entrée utilisateur dans des requêtes côté serveur vers des API internes. Si cette entrée n’est pas correctement encodée, vous pouvez injecter ou écraser des paramètres dans la requête interne. Testez toute entrée utilisateur, y compris les paramètres de requête, les champs de formulaire, les en-têtes et les paramètres de chemin d’URL.

Sondes courantes :

  • Add a new parameter with %26 (URL-encoded &).
  • Truncate the downstream query with %23 (URL-encoded #).
  • Override an existing parameter by duplicating it.

Example:

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

Peut potentiellement entraîner une requête côté serveur comme :

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

Parameter pollution par technologie

Ces résultats proviennent de https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89

PHP 8.3.11 AND Apache 2.4.62

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

  1. Ignorer tout après %00 dans le nom du paramètre.
  2. Traite name[] comme tableau.
  3. _GET ne signifie pas la méthode GET.
  4. Préfère le dernier paramètre.

Ruby 3.3.5 and WEBrick 1.8.2

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

  1. Utilise les délimiteurs & et ; pour séparer les paramètres.
  2. Ne reconnaît pas name[].
  3. Préfère le premier paramètre.

Spring MVC 6.0.23 AND 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 reconnaissent name[].
  3. Préfère name si name ET name[] existent.
  4. Concatène les paramètres ex. first,last.
  5. POST RequestMapping & PostMapping reconnaissent les query parameters avec Content-Type.

NodeJS 20.17.0 AND Express 4.21.0

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

  1. Reconnaît name[].
  2. Concatène les paramètres ex. first,last.

GO 1.22.7

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

  1. Ne reconnaît PAS name[].
  2. Préfère le premier paramètre.

Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3

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

  1. Ne reconnaît PAS name[].
  2. Préfère le premier paramètre.

Python 3.12.6 AND Django 4.2.15

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

  1. Ne reconnaît PAS name[].
  2. Préfère le dernier paramètre.

Python 3.12.6 AND Tornado 6.4.1

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

  1. Ne reconnaît PAS name[].
  2. Préfère le dernier paramètre.

JSON Injection

JSON, XML and YAML Hacking

Clés dupliquées

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

Le front-end pourrait croire la première occurrence tandis que le backend utilise la deuxième occurrence de la clé.

Key Collision : Troncature de caractères et commentaires

Certains caractères ne vont pas être correctement interprétés par le frontend mais le backend les interprétera et utilisera ces clés, ceci pourrait être utile pour bypass certain restrictions:

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

Remarquez comment, dans ces cas, le front end peut penser que test == 1 et le backend pensera que test == 2.

Cela peut aussi être utilisé pour contourner des restrictions de valeur comme :

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

Utilisation de la troncature des commentaires

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

Ici, nous utiliserons le sérialiseur de chaque parseur pour afficher sa sortie respective.

Sérialiseur 1 (par exemple, la bibliothèque GoJay de GoLang) produira :

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

Sérialiseur 2 (par exemple, la bibliothèque JSON-iterator de Java) produira :

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

Alternativement, l’utilisation directe des commentaires peut aussi être efficace :

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

La bibliothèque GSON de Java:

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

La bibliothèque simdjson de Ruby :

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

Précédence incohérente : Deserialization vs. Serialization

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

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

Float and Integer

Le nombre

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

peut être décodé en plusieurs représentations, y compris :

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Ce qui pourrait créer des incohérences

Références

Tip

Apprenez et pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Parcourez le catalogue complet de HackTricks Training pour les parcours d’évaluation (ARTA/GRTA/AzRTA) et Linux Hacking Expert (LHE).

Support HackTricks