Parameter Pollution | JSON Injection
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Panoramica sullâHTTP Parameter Pollution (HPP)
LâHTTP Parameter Pollution (HPP) è una tecnica in cui gli attaccanti manipolano i parametri HTTP per cambiare il comportamento di unâapplicazione web in modi non intenzionati. Questa manipolazione avviene aggiungendo, modificando o duplicando i parametri HTTP. Lâeffetto di queste manipolazioni non è direttamente visibile allâutente, ma può alterare significativamente la funzionalitĂ dellâapplicazione sul lato server, con impatti osservabili sul lato client.
Esempio di HTTP Parameter Pollution (HPP)
Un URL di transazione di unâapplicazione bancaria:
- URL originale:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Inserendo un ulteriore parametro from:
- URL manipolato:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
La transazione potrebbe essere erroneamente addebitata a accountC invece di accountA, dimostrando il potenziale dellâHPP di manipolare transazioni o altre funzionalitĂ come il reset della password, le impostazioni 2FA o le richieste di chiavi API.
Parsing dei parametri specifico per tecnologia
- Il modo in cui i parametri vengono analizzati e prioritizzati dipende dalla tecnologia web sottostante, influenzando come lâHPP può essere sfruttato.
- Strumenti come Wappalyzer aiutano a identificare queste tecnologie e i loro comportamenti di parsing.
Sfruttamento di PHP e HPP
Caso di manipolazione OTP:
- Contesto: Un meccanismo di accesso che richiede una One-Time Password (OTP) è stato sfruttato.
- Metodo: Intercettando la richiesta OTP utilizzando strumenti come Burp Suite, gli attaccanti hanno duplicato il parametro
emailnella richiesta HTTP. - Risultato: LâOTP, destinato allâemail iniziale, è stato invece inviato al secondo indirizzo email specificato nella richiesta manipolata. Questa vulnerabilitĂ ha consentito lâaccesso non autorizzato eludendo la misura di sicurezza prevista.
Questo scenario evidenzia una grave svista nel backend dellâapplicazione, che ha elaborato il primo parametro email per la generazione dellâOTP ma ha utilizzato lâultimo per la consegna.
Caso di manipolazione della chiave API:
- Scenario: Unâapplicazione consente agli utenti di aggiornare la propria chiave API tramite una pagina delle impostazioni del profilo.
- Vettore di attacco: Un attaccante scopre che aggiungendo un ulteriore parametro
api_keyalla richiesta POST, può manipolare lâesito della funzione di aggiornamento della chiave API. - Tecnica: Utilizzando uno strumento come Burp Suite, lâattaccante crea una richiesta che include due parametri
api_key: uno legittimo e uno malevolo. Il server, elaborando solo lâultima occorrenza, aggiorna la chiave API al valore fornito dallâattaccante. - Risultato: Lâattaccante ottiene il controllo sulla funzionalitĂ API della vittima, potenzialmente accedendo o modificando dati privati in modo non autorizzato.
Questo esempio sottolinea ulteriormente la necessitĂ di una gestione sicura dei parametri, specialmente in funzionalitĂ critiche come la gestione delle chiavi API.
Parsing dei parametri: Flask vs. PHP
Il modo in cui le tecnologie web gestiscono i parametri HTTP duplicati varia, influenzando la loro suscettibilitĂ agli attacchi HPP:
- Flask: Adotta il primo valore del parametro incontrato, come
a=1in una stringa di querya=1&a=2, privilegiando lâistanza iniziale rispetto ai duplicati successivi. - PHP (su Apache HTTP Server): Al contrario, privilegia lâultimo valore del parametro, optando per
a=2nellâesempio fornito. Questo comportamento può facilitare involontariamente gli exploit HPP onorando il parametro manipolato dallâattaccante rispetto allâoriginale.
Inquinamento dei parametri per tecnologia
I risultati sono stati presi da https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 E Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ignora tutto dopo %00 nel nome del parametro.
- Gestisce name[] come array.
- _GET non significa metodo GET.
- Preferisce lâultimo parametro.
Ruby 3.3.5 e WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Usa i delimitatori & e ; per separare i parametri.
- Non riconosce name[].
- Preferisce il primo parametro.
Spring MVC 6.0.23 E 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 riconoscono name[].
- Preferisce name se name E name[] esistono.
- Concatenare i parametri e.g. first,last.
- POST RequestMapping & PostMapping riconoscono i parametri di query con Content-Type.
NodeJS 20.17.0 E Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Riconosce name[].
- Concatenare i parametri e.g. first,last.
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- NON riconosce name[].
- Preferisce il primo parametro.
Python 3.12.6 E Werkzeug 3.0.4 E Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- NON riconosce name[].
- Preferisce il primo parametro.
Python 3.12.6 E Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- NON riconosce name[].
- Preferisce lâultimo parametro.
Python 3.12.6 E Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- NON riconosce name[].
- Preferisce lâultimo parametro.
JSON Injection
Chiavi duplicate
obj = {"test": "user", "test": "admin"}
Il front-end potrebbe credere alla prima occorrenza mentre il backend utilizza la seconda occorrenza della chiave.
Collisione di Chiavi: Troncamento dei Caratteri e Commenti
Al alcuni caratteri non verranno interpretati correttamente dal frontend, ma il backend li interpreterĂ e utilizzerĂ quelle chiavi, questo potrebbe essere utile per bypassare certe restrizioni:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Nota come in questi casi il front end potrebbe pensare che test == 1 e il backend penserĂ che test == 2.
Questo può anche essere usato per bypassare le restrizioni sui valori come:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Utilizzo della Troncatura dei Commenti
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Qui utilizzeremo il serializer di ciascun parser per visualizzare il rispettivo output.
Serializer 1 (ad esempio, la libreria GoJay di GoLang) produrrĂ :
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (ad esempio, la libreria JSON-iterator di Java) produrrĂ :
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
In alternativa, lâuso diretto dei commenti può essere efficace:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
La libreria GSON di Java:
{ "description": "Comment support", "test": 1, "extra": "a" }
La libreria simdjson di Ruby:
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
Precedenza Incoerente: Deserializzazione vs. Serializzazione
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Float e Intero
Il numero
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
può essere decodificato in piÚ rappresentazioni, inclusi:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Potrebbe creare incoerenze
Riferimenti
- 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
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

