hacktricks/pentesting-web/parameter-pollution.md

13 KiB

Parameter Pollution | JSON Injection

Parameter Pollution

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

{% embed url="https://websec.nl/" %}

HTTP Parameter Pollution (HPP) Overview

HTTP Parameter Pollution (HPP) je tehnika gde napadači manipulišu HTTP parametrima kako bi promenili ponašanje web aplikacije na nepredviđene načine. Ova manipulacija se vrši dodavanjem, modifikovanjem ili dupliciranjem HTTP parametara. Efekat ovih manipulacija nije direktno vidljiv korisniku, ali može značajno promeniti funkcionalnost aplikacije na serverskoj strani, sa uočljivim uticajima na klijentskoj strani.

Example of HTTP Parameter Pollution (HPP)

URL transakcije bankarske aplikacije:

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

Umetanjem dodatnog from parametra:

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

Transakcija može biti pogrešno naplaćena na accountC umesto na accountA, pokazujući potencijal HPP-a da manipuliše transakcijama ili drugim funkcionalnostima kao što su resetovanje lozinke, podešavanja 2FA ili zahtevi za API ključem.

Technology-Specific Parameter Parsing

  • Način na koji se parametri analiziraju i prioritetizuju zavisi od osnovne web tehnologije, što utiče na to kako se HPP može iskoristiti.
  • Alati poput Wappalyzer pomažu u identifikaciji ovih tehnologija i njihovih ponašanja prilikom analize.

PHP and HPP Exploitation

OTP Manipulation Case:

  • Context: Mehanizam prijavljivanja koji zahteva jednokratnu lozinku (OTP) je iskorišćen.
  • Method: Presretanjem zahteva za OTP koristeći alate poput Burp Suite, napadači su duplicirali email parametar u HTTP zahtevu.
  • Outcome: OTP, namenjen za inicijalnu email adresu, umesto toga je poslat na drugu email adresu navedenu u manipulisanom zahtevu. Ova greška je omogućila neovlašćen pristup zaobilaženjem predviđene sigurnosne mere.

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 omogućava korisnicima da ažuriraju svoj API ključ putem stranice za podešavanje profila.
  • Attack Vector: Napadač otkriva da dodavanjem dodatnog api_key parametra u POST zahtev može manipulisati ishodom funkcije ažuriranja API ključa.
  • Technique: Koristeći alat poput Burp Suite, napadač kreira zahtev koji uključuje dva api_key parametra: jedan legitimni i jedan maliciozni. Server, obrađujući samo poslednju pojavu, ažurira API ključ na vrednost koju je naveo napadač.
  • Result: Napadač dobija kontrolu nad funkcionalnošću API-ja žrtve, potencijalno pristupajući ili modifikujući privatne podatke neovlašćeno.

Ovaj primer dodatno naglašava potrebu za sigurnim rukovanjem parametrima, posebno u funkcijama koje su kritične kao što je upravljanje API ključem.

Parameter Parsing: Flask vs. PHP

Način na koji web tehnologije obrađuju duple HTTP parametre varira, utičući na njihovu podložnost HPP napadima:

  • Flask: Usvaja prvu vrednost parametra koja se susreće, kao što je a=1 u upitu a=1&a=2, prioritetizujući inicijalnu instancu nad kasnijim duplikatima.
  • PHP (na Apache HTTP Server-u): Nasuprot tome, prioritetizuje poslednju vrednost parametra, birajući a=2 u datom primeru. Ovo ponašanje može nenamerno olakšati HPP eksploate tako što poštuje manipulisan parametar napadača umesto originalnog.

Parameter pollution by technology

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ši sve nakon %00 u imenu parametra.
  2. Rukuj sa name[] kao nizom.
  3. _GET ne znači GET metodu.
  4. Preferiraj 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 ; delimitere za razdvajanje parametara.
  2. Ne prepoznaje name[].
  3. Preferiraj 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. Preferiraj name ako name i name[] postoje.
  4. Konkateniraj parametre npr. first,last.
  5. POST RequestMapping & PostMapping prepoznaju upitni parametar 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. Konkateniraj 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. Preferiraj 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. Preferiraj 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. Preferiraj 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. Preferiraj poslednji parametar.

JSON Injection

Duplicate keys

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

Frontend može verovati prvoj pojavi, dok backend koristi drugu pojavu ključa.

Sudar ključeva: Skraćivanje karaktera i komentari

Određeni karakteri neće biti ispravno interpretirani od strane frontenda, ali backend će ih interpretirati i koristiti te ključeve, što može biti korisno za obići određena ograničenja:

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

Napomena kako u ovim slučajevima frontend može misliti da je test == 1, dok backend može 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 skraćivanja komentara

{% code overflow="wrap" %}

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

{% endcode %}

Ovde ćemo koristiti serializer iz svakog parsera da bismo videli njegov odgovarajući izlaz.

Serializer 1 (npr., GoLangova GoJay biblioteka) će proizvesti:

  • description = "Duplikat sa komentarima"
  • test = 2
  • extra = ""

Serializer 2 (npr., Java-ova JSON-iterator biblioteka) će proizvesti:

  • description = "Duplikat sa komentarima"
  • extra = "/*"
  • extra2 = "*/"
  • test = 1

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

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

Java-ova GSON biblioteka:

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

Rubyjeva simdjson biblioteka:

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

Nepodudarnost Prioriteta: Deserijalizacija naspram Serijalizacije

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

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

Float and Integer

Broj

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

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

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807

Koje bi mogle stvoriti nesuglasice

Reference

{% embed url="https://websec.nl/" %}

{% hint style="success" %} 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)

Podržite HackTricks
{% endhint %}