13 KiB
Zanieczyszczenie parametrów | Wstrzykiwanie JSON
Zanieczyszczenie parametrów
{% hint style="success" %}
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)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się sztuczkami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
{% embed url="https://websec.nl/" %}
Przegląd HTTP Parameter Pollution (HPP)
HTTP Parameter Pollution (HPP) to technika, w której atakujący manipulują parametrami HTTP, aby zmienić zachowanie aplikacji webowej 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
Wstawiając dodatkowy parametr 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.
Analiza parametrów specyficznych dla technologii
- 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 analityczne.
Wykorzystanie HPP w PHP
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
email
w żądaniu HTTP. - Wynik: OTP, przeznaczone dla początkowego adresu e-mail, zostało 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 krytyczny błąd 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 przez stronę ustawień profilu.
- Wektor ataku: Atakujący odkrywa, że dodając dodatkowy parametr
api_key
do żądania POST, może 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 w sposób nieautoryzowany.
Ten przykład dodatkowo podkreśla konieczność bezpiecznego zarządzania parametrami, szczególnie w funkcjach tak krytycznych jak zarządzanie kluczem API.
Analiza 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=1
w ciągu zapytaniaa=1&a=2
, priorytetując początkową instancję nad kolejnymi duplikatami. - PHP (na serwerze Apache HTTP): Przeciwnie, priorytetuje ostatnią wartość parametru, wybierając
a=2
w podanym przykładzie. To zachowanie może niezamierzenie ułatwić wykorzystanie HPP, honorując złośliwy parametr atakującego nad oryginalnym.
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
- 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
- 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
- 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 parametry zapytania z Content-Type.
NodeJS 20.17.0 I Express 4.21.0
- Rozpoznaje name[].
- Łącz parametry, np. first,last.
GO 1.22.7
- NIE rozpoznaje name[].
- Preferuj pierwszy parametr.
Python 3.12.6 I Werkzeug 3.0.4 I Flask 3.0.3
- NIE rozpoznaje name[].
- Preferuj pierwszy parametr.
Python 3.12.6 I Django 4.2.15
- NIE rozpoznaje name[].
- Preferuj ostatni parametr.
Python 3.12.6 I Tornado 6.4.1
- 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 pewnych ograniczeń:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Zauważ, jak w tych przypadkach front end 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
{% code overflow="wrap" %}
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
{% endcode %}
Tutaj użyjemy serializatora z każdego parsera, aby zobaczyć jego odpowiedni wynik.
Serializer 1 (np. biblioteka GoJay w GoLang) wygeneruje:
description = "Duplikat z komentarzami"
test = 2
extra = ""
Serializer 2 (np. biblioteka JSON-iterator w Javie) wygeneruje:
description = "Duplikat z komentarzami"
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
Które mogą tworzyć niespójności
Odniesienia
- 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
{% embed url="https://websec.nl/" %}
{% hint style="success" %}
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)
Wsparcie 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 github.