Parameter Pollution | JSON Injection

Tip

Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Supporta HackTricks

Panoramica di HTTP Parameter Pollution (HPP)

HTTP Parameter Pollution (HPP) è una tecnica in cui gli attacker manipolano i parametri HTTP per modificare il comportamento di un’applicazione web in modi non previsti. Questa manipolazione viene effettuata 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)

Una URL di transazione di una banca:

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

Inserendo un parametro from aggiuntivo:

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

La transazione potrebbe essere addebitata erroneamente a accountC invece che a accountA, mostrando il potenziale dell’HPP di manipolare transazioni o altre funzionalità come reset delle password, impostazioni 2FA, o richieste di API key.

Technology-Specific Parameter Parsing

  • Il modo in cui i parametri vengono parsati 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 HPP in PHP

OTP Manipulation Case:

  • Context: Un meccanismo di login che richiede un One-Time Password (OTP) è stato sfruttato.
  • Method: Intercettando la richiesta OTP con strumenti come Burp Suite, gli attacker hanno duplicato il parametro email nella richiesta HTTP.
  • Outcome: L’OTP, destinato all’email iniziale, è stato invece inviato al secondo indirizzo email specificato nella richiesta manipolata. Questa falla ha permesso accessi non autorizzati aggirando la misura di sicurezza prevista.

Questo scenario evidenzia una svista critica nel backend dell’applicazione, che ha processato il primo parametro email per la generazione dell’OTP ma ha usato l’ultimo per la consegna.

API Key Manipulation Case:

  • Scenario: Un’applicazione permette agli utenti di aggiornare la propria API key tramite una pagina di impostazioni del profilo.
  • Attack Vector: Un attacker scopre che aggiungendo un parametro api_key aggiuntivo alla richiesta POST, può manipolare l’esito della funzione di aggiornamento della API key.
  • Technique: Utilizzando uno strumento come Burp Suite, l’attacker costruisce una richiesta che include due parametri api_key: uno legittimo e uno maligno. Il server, processando solo l’ultima occorrenza, aggiorna la API key con il valore fornito dall’attacker.
  • Result: L’attacker ottiene il controllo sulle 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 API key.

Parsing dei parametri: Flask vs. PHP

Il modo in cui le tecnologie web gestiscono parametri HTTP duplicati varia, influenzando la loro suscettibilità agli attacchi HPP:

  • Flask: Adotta il primo valore del parametro incontrato, ad esempio a=1 in una query string a=1&a=2, prioritizzando l’istanza iniziale rispetto ai duplicati successivi.
  • PHP (on Apache HTTP Server): Al contrario, prioritizza l’ultimo valore del parametro, optando per a=2 nell’esempio dato. Questo comportamento può facilitare involontariamente gli exploit HPP dando precedenza al parametro manipolato dall’attacker rispetto all’originale.

Note di testing HPP (OWASP WSTG)

  • Gli standard HTTP non definiscono come interpretare più parametri con lo stesso nome, quindi il comportamento varia tra stack e componenti.
  • Quando si testa HPP lato server, duplica ogni parametro nelle query string o nei body e osserva se l’applicazione concatena i valori, usa il primo/ultimo, o genera errori.
  • Per HPP lato client, injecta un & codificato in URL in un valore di parametro riflesso (es., %26HPP_TEST) e cerca occorrenze decodificate come &HPP_TEST o &HPP_TEST all’interno di link generati o action di form.

Server-Side Parameter Pollution (SSPP) in Internal APIs

Alcune applicazioni inseriscono input utente in richieste server-side a internal APIs. Se quell’input non è correttamente encodato, puoi injectare o sovrascrivere parametri nella richiesta interna. Testa qualsiasi input utente, inclusi query parameters, campi dei form, headers e URL path parameters.

Probe comuni:

  • Aggiungi un nuovo parametro con %26 (URL-encoded &).
  • Trunca la query a valle con %23 (URL-encoded #).
  • Sovrascrivi un parametro esistente duplicandolo.

Esempio:

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

Potenzialmente porta a una server-side request come:

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

Parameter pollution by technology

I risultati sono stati presi da 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. Ignora tutto ciò che viene dopo %00 nel nome del parametro.
  2. Gestisce name[] come array.
  3. _GET non significa GET Method.
  4. Preferisce l’ultimo parametro.

Ruby 3.3.5 and WEBrick 1.8.2

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

  1. Usa i delimitatori & e ; per separare i parametri.
  2. Non riconosce name[].
  3. Preferisce il primo parametro.

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 riconoscono name[].
  3. Preferisce name se name e name[] sono entrambi presenti.
  4. Concatena i parametri, es. first,last.
  5. POST RequestMapping & PostMapping riconoscono query parameter con 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. Riconosce name[].
  2. Concatena i parametri, es. first,last.

GO 1.22.7

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

  1. Non riconosce name[].
  2. Preferisce il primo parametro.

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. Non riconosce name[].
  2. Preferisce il primo parametro.

Python 3.12.6 AND Django 4.2.15

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

  1. Non riconosce name[].
  2. Preferisce l’ultimo parametro.

Python 3.12.6 AND Tornado 6.4.1

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

  1. Non riconosce name[].
  2. Preferisce l’ultimo parametro.

JSON Injection

JSON, XML and YAML Hacking

Chiavi duplicate

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

Il front-end potrebbe considerare valida la prima occorrenza mentre il backend utilizza la seconda occorrenza della chiave.

Collisione di chiavi: troncamento dei caratteri e commenti

Alcuni caratteri non verranno correttamente interpretati dal front-end, ma il backend li interpreterà e userà quelle chiavi; questo può essere utile per bypass certain restrictions:

{"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 restrizioni sui valori come:

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

Utilizzo del troncamento dei commenti

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

Qui useremo il serializer di ciascun parser per visualizzare il rispettivo output.

Serializer 1 (e.g., GoLang’s GoJay library) will produce:

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

Serializer 2 (e.g., Java’s JSON-iterator library) will produce:

  • 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: Deserialization vs. Serialization

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

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

Virgola mobile e Intero

Il numero

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

può essere decodificato in più rappresentazioni, tra cui:

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Ciò potrebbe creare incoerenze

Riferimenti

Tip

Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Supporta HackTricks