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
- Consultez les subscription plans!
- Rejoignez 💬 le groupe Discord, le groupe telegram, suivez @hacktricks_live sur X/Twitter, ou consultez la page LinkedIn et la chaîne YouTube.
- Partagez des hacking tricks en soumettant des PRs aux dépôts github HackTricks et HackTricks Cloud.
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
emaildans 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_keysupplé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=1dans une query stringa=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=2dans 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_TESTou&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
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ignorer tout après %00 dans le nom du paramètre.
- Traite name[] comme tableau.
- _GET ne signifie pas la méthode GET.
- Préfère le dernier paramètre.
Ruby 3.3.5 and WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Utilise les délimiteurs & et ; pour séparer les paramètres.
- Ne reconnaît pas name[].
- Préfère le premier paramètre.
Spring MVC 6.0.23 AND Apache Tomcat 10.1.30
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
- POST RequestMapping & PostMapping reconnaissent name[].
- Préfère name si name ET name[] existent.
- Concatène les paramètres ex. first,last.
- POST RequestMapping & PostMapping reconnaissent les query parameters avec Content-Type.
NodeJS 20.17.0 AND Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Reconnaît name[].
- Concatène les paramètres ex. first,last.
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- Ne reconnaît PAS name[].
- Préfère le premier paramètre.
Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- Ne reconnaît PAS name[].
- Préfère le premier paramètre.
Python 3.12.6 AND Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- Ne reconnaît PAS name[].
- Préfère le dernier paramètre.
Python 3.12.6 AND Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- Ne reconnaît PAS name[].
- Préfère le dernier paramètre.
JSON Injection
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 = 2extra = ""
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
-
https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654
-
https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution
-
https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
-
https://bishopfox.com/blog/json-interoperability-vulnerabilities
-
https://portswigger.net/web-security/api-testing/server-side-parameter-pollution
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
- Consultez les subscription plans!
- Rejoignez 💬 le groupe Discord, le groupe telegram, suivez @hacktricks_live sur X/Twitter, ou consultez la page LinkedIn et la chaîne YouTube.
- Partagez des hacking tricks en soumettant des PRs aux dépôts github HackTricks et HackTricks Cloud.


