Parameter Pollution | JSON Injection
Last updated
Last updated
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)
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.
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.
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.
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.
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 zapytania a=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.
Wyniki zostały zaczerpnięte z https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
Ignoruj wszystko po %00 w nazwie parametru.
Obsługuj name[] jako tablicę.
_GET nie oznacza metody GET.
Preferuj ostatni parametr.
Używa & i ; jako separatorów do dzielenia parametrów.
Nie rozpoznaje name[].
Preferuje pierwszy parametr.
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.
Rozpoznaje name[].
Łącz parametry, np. first,last.
NIE rozpoznaje name[].
Preferuj pierwszy parametr.
NIE rozpoznaje name[].
Preferuj pierwszy parametr.
NIE rozpoznaje name[].
Preferuj ostatni parametr.
NIE rozpoznaje name[].
Preferuj ostatni parametr.
Front-end może uwierzyć w pierwsze wystąpienie, podczas gdy backend używa drugiego wystąpienia klucza.
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ń:
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:
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:
Biblioteka GSON w Javie:
Biblioteka simdjson w Ruby:
Liczba
może być dekodowane do wielu reprezentacji, w tym:
Które mogą tworzyć niespójności
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)