Parameter Pollution | JSON Injection

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Pregled HTTP Parameter Pollution (HPP)

HTTP Parameter Pollution (HPP) je tehnika u kojoj napadači manipulišu HTTP parametrima kako bi promenili ponašanje web aplikacije na neželjene načine. Ova manipulacija se vrši dodavanjem, izmenom ili dupliranjem HTTP parametara. Efekat ovih manipulacija nije direktno vidljiv korisniku, ali može značajno izmeniti funkcionalnost aplikacije na strani servera, sa vidljivim posledicama na klijentu.

Primer HTTP Parameter Pollution (HPP)

URL transakcije bankarske aplikacije:

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

Ubacivanjem dodatnog from parametra:

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

Transakcija može biti pogrešno terećena na accountC umesto accountA, što pokazuje potencijal HPP-a za manipulaciju transakcijama ili drugim funkcionalnostima kao što su password resets, 2FA podešavanja ili zahtevi za API key.

Technology-Specific Parameter Parsing

  • Način na koji se parametri parsiraju i prioritetizuju zavisi od underlying web tehnologije, što utiče na to kako se HPP može iskoristiti.
  • Alati kao što je Wappalyzer pomažu u identifikaciji tih tehnologija i njihovih ponašanja pri parsiranju.

PHP and HPP Exploitation

OTP Manipulation Case:

  • Context: Mehanizam za prijavu koji zahteva One-Time Password (OTP) je iskorišćen.
  • Method: Prekidom zahteva za OTP pomoću alata kao što je Burp Suite, napadači su duplirali email parametar u HTTP zahtevu.
  • Outcome: OTP, namenjen za prvobitni email, je umesto toga poslat na drugi email naveden u manipulisanoj zahtevu. Ovaj propust je omogućio neovlašćen pristup zaobilaženjem predviđene mere bezbednosti.

Ovaj scenario ističe kritičan propust u backend-u aplikacije, koji je obradio prvi email parametar za generisanje OTP-a ali je koristio poslednji za isporuku.

API Key Manipulation Case:

  • Scenario: Aplikacija dozvoljava korisnicima da ažuriraju svoj API key kroz stranicu za podešavanja profila.
  • Attack Vector: Napadač otkriva da dodavanjem dodatnog api_key parametra u POST zahtev može manipulisati ishodom funkcije za ažuriranje API key-a.
  • Technique: Korišćenjem alata kao što je Burp Suite, napadač kreira zahtev koji uključuje dva api_key parametra: jedan legitimni i jedan maliciozni. Server, procesuirajući samo poslednju pojavu, ažurira API key na vrednost koju je napadač obezbedio.
  • Result: Napadač stiče kontrolu nad API funkcionalnošću žrtve, potencijalno pristupajući ili menjajući privatne podatke bez autorizacije.

Ovaj primer dodatno naglašava potrebu za sigurnim rukovanjem parametrima, naročito kod funkcionalnosti koje su kritične kao što je upravljanje API key-evima.

Parsiranje parametara: Flask vs. PHP

Način na koji web tehnologije tretiraju duplirane HTTP parametre varira, što utiče na njihovu podložnost HPP napadima:

  • Flask: Usvaja prvu vrednost parametra koja se naiđe, na primer a=1 u query stringu a=1&a=2, dajući prioritet početnom primeru u odnosu na naknadne duplikate.
  • PHP (on Apache HTTP Server): Suprotno tome, daje prioritet poslednjoj vrednosti parametra, birajući a=2 u datom primeru. Ovo ponašanje može nenamerno omogućiti HPP eksploatacije tako što će prihvatiti manipulisani parametar napadača umesto originalnog.

HPP Testing Notes (OWASP WSTG)

  • HTTP standardi ne definišu kako tumačiti više parametara istog imena, tako da ponašanje varira između stack-ova i komponenti.
  • Kada testirate server-side HPP, duplirajte svaki parametar u query stringovima ili telima zahteva i posmatrajte da li aplikacija concatenira vrednosti, koristi first/last, ili javlja grešku.
  • Za client-side HPP, ubacite URL-encoded & u reflektovanu vrednost parametra (npr. %26HPP_TEST) i tražite dekodirane pojave poput &HPP_TEST ili &HPP_TEST unutar generisanih linkova ili form actions.

Server-Side Parameter Pollution (SSPP) in Internal APIs

Neke aplikacije ugrađuju korisnički input u server-side zahteve ka internal APIs. Ako taj input nije pravilno enkodiran, možete injektovati ili prebrisati parametre u internom zahtevu. Testirajte bilo koji korisnički input, uključujući query parametre, form fields, headers, i URL path parameters.

Common probes:

  • 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

Može potencijalno rezultirati server-side zahtevom kao:

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

Parameter pollution po tehnologiji

There results were taken from 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. Ignoriše sve posle %00 u imenu parametra .
  2. Tretira name[] kao array .
  3. _GET ne znači GET metodu .
  4. Preferira poslednji parametar .

Ruby 3.3.5 and WEBrick 1.8.2

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

  1. Koristi & i ; kao delimitere za razdvajanje parametara .
  2. Ne prepoznaje name[] .
  3. Preferira prvi parametar .

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 prepoznaju name[] .
  3. Preferira name ako name AND name[] postoje .
  4. Kombinuje parametre npr. first,last .
  5. POST RequestMapping & PostMapping prepoznaju query parameter sa 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. Prepoznaje name[] .
  2. Kombinuje parametre npr. first,last .

GO 1.22.7

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

  1. Ne prepoznaje name[] .
  2. Preferira prvi parametar .

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 prepoznaje name[] .
  2. Preferira prvi parametar .

Python 3.12.6 AND Django 4.2.15

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

  1. Ne prepoznaje name[] .
  2. Preferira poslednji parametar .

Python 3.12.6 AND Tornado 6.4.1

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

  1. Ne prepoznaje name[] .
  2. Preferira poslednji parametar .

JSON Injection

JSON, XML and YAML Hacking

Duplikat ključeva

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

Front-end može prihvatiti prvu pojavu ključa, dok backend koristi drugu pojavu ključa.

Key Collision: Character Truncation and Comments

Neki karakteri neće biti pravilno interpretirani od strane front-enda, ali ih backend hoće interpretirati i koristiti kao ključeve; ovo može biti korisno za zaobilaženje određenih ograničenja:

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

Obratite pažnju kako u ovim slučajevima front end možda misli da je test == 1, dok će backend misliti da je test == 2.

Ovo se takođe može koristiti za zaobilaženje ograničenja vrednosti kao što su:

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

Korišćenje Comment Truncation

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

Ovde ćemo koristiti serializer svakog parsera da pregledamo njihov odgovarajući izlaz.

Serializer 1 (npr. GoLang’s GoJay library) će proizvesti:

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

Serializer 2 (npr. Java’s JSON-iterator library) će proizvesti:

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

Alternativno, direktna upotreba komentara takođe može biti efikasna:

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

GSON biblioteka za Java:

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

simdjson biblioteka za Ruby:

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

Nedosledna precedenca: Deserialization vs. Serialization

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

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

Float i Integer

Broj

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

može se dekodirati u više oblika, uključujući:

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Što može izazvati nedoslednosti

Referencije

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks