Zanieczyszczenie parametrów | Wstrzykiwanie JSON
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Przegląd HTTP Parameter Pollution (HPP)
HTTP Parameter Pollution (HPP) to technika, w której atakujący manipulują parametrami HTTP, aby zmienić zachowanie aplikacji internetowej w niezamierzony sposób. Manipulacja ta polega na dodawaniu, modyfikowaniu lub duplikowaniu parametrów HTTP. Efekt tych manipulacji nie jest bezpośrednio widoczny dla użytkownika, ale może znacząco zmienić funkcjonalność aplikacji po stronie serwera, z zauważalnymi skutkami po stronie klienta.
Przykład HTTP Parameter Pollution (HPP)
URL transakcji aplikacji bankowej:
- Oryginalny URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Poprzez dodanie dodatkowego parametru from:
- Manipulowany URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
Transakcja może być błędnie obciążona na accountC zamiast accountA, co pokazuje potencjał HPP do manipulacji transakcjami lub innymi funkcjonalnościami, takimi jak resetowanie haseł, ustawienia 2FA czy żądania kluczy API.
Specyficzne dla technologii parsowanie parametrów
- Sposób, w jaki parametry są analizowane i priorytetowane, zależy od używanej technologii webowej, co wpływa na to, jak HPP może być wykorzystywane.
- Narzędzia takie jak Wappalyzer pomagają zidentyfikować te technologie i ich zachowania w zakresie parsowania.
PHP i wykorzystanie HPP
Przypadek manipulacji OTP:
- Kontekst: Mechanizm logowania wymagający jednorazowego hasła (OTP) został wykorzystany.
- Metoda: Poprzez przechwycenie żądania OTP za pomocą narzędzi takich jak Burp Suite, atakujący zduplikował parametr
emailw żądaniu HTTP. - Wynik: OTP, przeznaczone dla początkowego adresu e-mail, zostało zamiast tego wysłane na drugi adres e-mail podany w manipulowanym żądaniu. Ta luka umożliwiła nieautoryzowany dostęp, omijając zamierzony środek bezpieczeństwa.
Ten scenariusz podkreśla krytyczne niedopatrzenie w backendzie aplikacji, który przetwarzał pierwszy parametr email do generacji OTP, ale używał ostatniego do dostarczenia.
Przypadek manipulacji kluczem API:
- Scenariusz: Aplikacja pozwala użytkownikom na aktualizację swojego klucza API poprzez stronę ustawień profilu.
- Wektor ataku: Atakujący odkrywa, że poprzez dodanie dodatkowego parametru
api_keydo żądania POST, mogą manipulować wynikiem funkcji aktualizacji klucza API. - Technika: Wykorzystując narzędzie takie jak Burp Suite, atakujący tworzy żądanie, które zawiera dwa parametry
api_key: jeden prawidłowy i jeden złośliwy. Serwer, przetwarzając tylko ostatnie wystąpienie, aktualizuje klucz API na wartość podaną przez atakującego. - Wynik: Atakujący zyskuje kontrolę nad funkcjonalnością API ofiary, potencjalnie uzyskując dostęp do prywatnych danych lub je modyfikując bez autoryzacji.
Ten przykład dodatkowo podkreśla konieczność bezpiecznego zarządzania parametrami, szczególnie w funkcjach tak krytycznych jak zarządzanie kluczem API.
Parsowanie parametrów: Flask vs. PHP
Sposób, w jaki technologie webowe obsługują duplikaty parametrów HTTP, różni się, co wpływa na ich podatność na ataki HPP:
- Flask: Przyjmuje pierwszą wartość parametru, np.
a=1w ciągu zapytaniaa=1&a=2, priorytetując początkowe wystąpienie nad kolejnymi duplikatami. - PHP (na serwerze Apache HTTP): Przeciwnie, priorytetowo traktuje ostatnią wartość parametru, wybierając
a=2w podanym przykładzie. To zachowanie może niezamierzenie ułatwić wykorzystanie HPP, honorując złośliwy parametr atakującego zamiast oryginalnego.
Zanieczyszczenie parametrów według technologii
Wyniki zostały zaczerpnięte z https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 I Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ignoruj wszystko po %00 w nazwie parametru.
- Obsługuj name[] jako tablicę.
- _GET nie oznacza metody GET.
- Preferuj ostatni parametr.
Ruby 3.3.5 i WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Używa & i ; jako separatorów do dzielenia parametrów.
- Nie rozpoznaje name[].
- Preferuje pierwszy parametr.
Spring MVC 6.0.23 I 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 rozpoznaje name[].
- Preferuj name, jeśli name i name[] istnieją.
- Łącz parametry, np. first,last.
- POST RequestMapping & PostMapping rozpoznaje parametr zapytania z Content-Type.
NodeJS 20.17.0 I Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Rozpoznaje name[].
- Łącz parametry, np. first,last.
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- NIE rozpoznaje name[].
- Preferuj pierwszy parametr.
Python 3.12.6 I Werkzeug 3.0.4 I Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- NIE rozpoznaje name[].
- Preferuj pierwszy parametr.
Python 3.12.6 I Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- NIE rozpoznaje name[].
- Preferuj ostatni parametr.
Python 3.12.6 I Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- NIE rozpoznaje name[].
- Preferuj ostatni parametr.
Wstrzykiwanie JSON
Duplikaty kluczy
obj = {"test": "user", "test": "admin"}
Front-end może uwierzyć w pierwsze wystąpienie, podczas gdy backend używa drugiego wystąpienia klucza.
Kolizja kluczy: Skracanie znaków i komentarze
Niektóre znaki nie będą poprawnie interpretowane przez frontend, ale backend je zinterpretuje i użyje tych kluczy, co może być przydatne do obejścia niektórych ograniczeń:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Zauważ, że w tych przypadkach frontend może myśleć, że test == 1, a backend będzie myślał, że test == 2.
Może to być również użyte do obejścia ograniczeń wartości, takich jak:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Używanie skracania komentarzy
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Tutaj użyjemy serializatora z każdego parsera, aby zobaczyć jego odpowiedni wynik.
Serializer 1 (np. biblioteka GoJay w GoLang) wygeneruje:
description = "Duplicate with comments"test = 2extra = ""
Serializer 2 (np. biblioteka JSON-iterator w Javie) wygeneruje:
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
Alternatywnie, proste użycie komentarzy może być również skuteczne:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Biblioteka GSON w Javie:
{ "description": "Comment support", "test": 1, "extra": "a" }
Biblioteka simdjson w Ruby:
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
Niespójna Precedencja: Deserializacja vs. Serializacja
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Float i Integer
Liczba
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
może być dekodowane do wielu reprezentacji, w tym:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Co może stworzyć niespójności
Referencje
- 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
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

