IDOR do przejęcia konta
Streszczenie
Witajcie ludzie! Po ukończeniu certyfikacji OSCP i chęci ponownego zagłębienia się w nagrody za błędy, zdecydowałem, że powinienem napisać kilka blogów w oparciu o moje wcześniejsze ustalenia w nadziei, że ktoś uzna je za przydatne lub wyciągnie z nich wnioski.
Ten opis obejmuje znalezienie dwóch luk w zabezpieczeniach IDOR i wykorzystanie ich do ujawnienia danych osobowych , co skutkuje przejęciem konta . Przejęcie konta było możliwe ze względu na sposób, w jaki firma obsługiwała proces odzyskiwania konta i było właściwie jednym z moich pierwszych odkryć, kiedy zaczynałem nagrody za błędy. Dreszczyk emocji związany ze znalezieniem tego skłonił mnie do ciągłego uczenia się w godzinach nadliczbowych.
Czym jest ten IDOR, o którym mówię?
Insecure Direct Object Reference
najczęściej w skrócie „IDOR” to rodzaj podatności, który można sklasyfikować w kategorii access control
. IDORs
występują w aplikacji, gdy aplikacja korzysta z danych wprowadzonych przez użytkownika w celu uzyskania bezpośredniego dostępu do obiektu bez przeprowadzania jakichkolwiek kontroli w celu sprawdzenia, czy użytkownik ma odpowiednie uprawnienia autoryzacyjne. Najczęściej związane z poziomą eskalacją uprawnień IDORs
może mieć szkodliwy wpływ na aplikację i jej bazę użytkowników.
Doskonałym przykładem typowych parametrów zwykle podatnych na identyfikatory IDOR są: id= | userID= | messageId=
. Zrozumienie przepływu aplikacji może ułatwić identyfikację tego typu problemów.
Powyższy obraz ilustruje dwa scenariusze. Scenario A
po lewej przedstawia bezpieczniejszą aplikację, w której users 2 and 3
próbuje uzyskać dostęp do poufnych zapisów, które do nich nie należą, jednak skutkuje to tak, jak access denied error
powinno.
Scenario B
Jednak po prawej stronie przedstawiono podatną na ataki aplikację, w przypadku której ugrupowanie cyberprzestępcze może wysyłać żądania do serwera sieciowego i pobierać poufne dane dotyczące dowolnego użytkownika bez odmowy dostępu.
Jeśli chcesz dowiedzieć się więcej o tym, IDORs
Vickie Li ma fantastyczny wpis na blogu, który rzuca światło na podstawy tego typu luk w zabezpieczeniach. Możesz to sprawdzić tutaj .
Powyższy przykład jest prosty, jednak w zależności od aplikacji możesz być w stanie wykorzystać informacje przed ich zgłoszeniem, aby zwiększyć wpływ, do czego zawsze dążę.
Teraz, gdy mamy pojęcie o tym, czym IDORs
są, gdzie można je znaleźć, a także o wpływie, przejdźmy do jednego z moich wczesnych odkryć! :)
Rekonesans
Chociaż problem został rozwiązany, nie mogłem uzyskać pozwolenia na pełne publiczne ujawnienie, więc cel będzie określany jako: example.com
. Podobnie jak w przypadku każdego celu, w zależności od scope
wyliczenia subdomeny jest kluczem do rozszerzenia powierzchni ataku. Jednak wyliczanie subdomen nie jest jedynym sposobem na rozszerzenie powierzchni ataku, ponieważ możemy również analizować JavaScript
pliki pod kątem poufnych informacji. W tym przypadku zdecydowałem się zacząć od szybkiego sprawdzenia, Google Dork
czy uda mi się znaleźć jakieś interesujące subdomeny, zanim użyję zautomatyzowanych narzędzi do uzyskania większej liczby wyników.
Google Dorek:site:*.example.com
Example.com
miał około 36 subdomen, więc całkiem niezła liczba subdomen do pracy!
Przeglądając je jedna po drugiej, zanotowałem dwie subdomeny, które miały dużo funkcjonalności. Poruszanie się po tych subdomenach i testowanie różnych funkcji zajęło mi dzień lub dwa, jednocześnie zapamiętując niektóre z bardziej interesujących funkcji specyficznych dla tej aplikacji. Na przykład aplikacja miała funkcję, w której można było tworzyć bilety, aby otrzymać wsparcie od personelu w różnych kategoriach, takich jak „Problemy z płatnościami”.
Początkowy błąd
Postanowiłem zacząć od przeanalizowania, jak działał proces rejestracji i logowania – podstawowa funkcja, która jest obecnie wdrażana w prawie wszystkich witrynach internetowych. Proces rejestracji w aplikacji internetowej można podsumować w następujący sposób:
- Użytkownik rejestruje się przez e-mail
- Użytkownik jest proszony o ustawienie
PIN No.
isecurity question
przed zakończeniem procesu tworzenia konta. Można to ustawić tylko raz i nie można go zmienić - Użytkownik jest proszony o potwierdzenie adresu e-mail, zanim będzie mógł się zalogować
Korzystając z account A
, uruchomiłem Burpsuite
i zacząłem testować funkcję sprzedaży biletów, utworzyłem dwa konta testowe, a następnie utworzyłem kilka zgłoszeń w różnych kategoriach wsparcia do celów testowych. Patrząc na HTTP History
in Burpsuite
, wykonano kilka interesujących połączeń.
Podczas odpowiadania członkowi personelu w zgłoszeniu związanym z roszczeniami o nagrodę zainicjowano następujące działania :POST request
POST /account/prizes/view/{123456} HTTP/1.1
Host: subdomainX.example.com
grant=w&prizeClaim_id={123456}&action=add_comment&comment_body=Hello+admin+...
Podsumowując dotychczasowe ustalenia:
- Podczas rejestracji każdy użytkownik musi utworzyć
PIN No.
isecurity question
- Witryna umożliwia użytkownikom tworzenie biletów pomocy technicznej w celu uzyskania pomocy
- Aby otrzymać wsparcie, użytkownik musi odpowiedzieć na swoje
PIN No.
isecurity question answer
delikatne sprawy, takie jak odzyskiwanie konta, roszczenia o nagrody i problemy z płatnościami IDOR
luka wykryta w systemie zgłoszeń umożliwia przeciwnikowi komentowanie w ramach dowolnego zgłoszenia do pomocy technicznej bez bycia właścicielem zgłoszenia lub członkiem personelu
Więc jeśli mógłbym opublikować komentarz na dowolnym bilecie, nie będąc właścicielem ani nie mając uprawnień członka personelu… z pewnością oznaczałoby to, że mógłbym przeczytać każdy bilet zbyt dobrze, prawda?
Przechwyciłem następujące żądanie GET, próbując wyświetlić bilet należący do account A
via account B
, co jednak doprowadziło do nielegalnego 403
błędu! Mogłem więc napisać do dowolnego zgłoszenia do pomocy technicznej, ale nie mogłem odczytać zawartości jednego. W tym momencie naprawdę chciałem znaleźć jakikolwiek możliwy sposób, aby posunąć się dalej.
GET Endpoint, aby odczytać bilet w aplikacji sieci Web
GET /management/ticket?id=343433 HTTP/1.1
Host: subdomainX.example.com
Upgrade-Insecure-Requests: 1
Connection: close
Podczas próby wykorzystania funkcji sprzedaży biletów natknąłem się na następującą prośbę;
GET /go.php?du=example.com/ HTTP/1.1
Host: subdomainX.example.com
Connection: close
Upgrade-Insecure-Requests: 1
Cookie:
Wyciek zawartości biletu przez API w aplikacji IOS
Podczas wstępnego rekonesansu zauważyłem, że niektóre API
żądania były wysyłane podczas pobierania informacji o profilu, ponadto cel miał również mobile app
zasięg. Było wysoce prawdopodobne, że chociaż odczytanie biletów innych użytkowników w samej aplikacji internetowej nie było możliwe, to może być osiągalne za pośrednictwem aplikacji mobilnej, ponieważ może to być inne niż API version/endpoint
aplikacja internetowa.
Odpalając Burpsuite
i przechodząc do sesji biletowej w aplikacji IOS, dotarłem do następującego punktu końcowego:
GET /api/v3/tickets/123456/posts HTTP/1.1
Host: x-api.example.com
Więc teraz znalazłem dwa błędy - można było pisać do dowolnego zgłoszenia ORAZ przeglądać zawartość dowolnego zgłoszenia należącego do innego użytkownika.
Eskalacja zgłoszenia Przeczytaj IDOR > Przejęcie konta
W tym momencie miałem prawie wszystkie elementy potrzebne do przejęcia konta. Ponieważ możliwe było odczytanie dowolnego biletu, przejęcie konta użytkownika mogło odbywać się w następujących krokach:
- Odwiedź
/api/v1/support-tickets/234567/posts
punkt końcowy i wyślij go dointruder
inBurpsuite
, aby wyliczyć jak najwięcej biletów Grep
dla słów kluczowych, takich jakPin Number
lubSecurity Question
z odpowiedzi- Załóż nowe konto na stronie i otwórz zgłoszenie pod
account recovery
- Przydzielony pracownik poprosi o nazwę użytkownika konta, które chcesz odzyskać, wraz z
security question answer
iPIN No.
, z których wszystkie mogą zostać ujawnione za pośrednictwem drugiego znalezionego identyfikatora IDOR; co skutkuje przejęciem konta.
Chociaż przejęcie konta zostało już osiągnięte, identyfikator zapisu biletu można również wykorzystać. Nazwy użytkowników poprzedzone były nazwą firmy, np example-John
. . Przeciwnik mógłby;
- Utwórz nowe konto z powyższą konwencją nazewnictwa, aby udawać pracownika
- Wylicz wszystkie otwarte/zamknięte identyfikatory biletów, używając identyfikatora odczytu biletu
- Komentuj w zgłoszeniach należących do wrażliwych kategorii, takich jak
Payment Issues/ Prize Claims
i proś użytkownika o ujawnienie dalszych informacji PII - Przeczytaj odpowiedź udzieloną przez użytkownika za pomocą Ticket Read IDOR
Dania na wynos
- Jeśli pozwala na to zakres, przetestuj te same funkcje zarówno w aplikacji internetowej, jak i aplikacji mobilnej
- Zawsze staraj się zwiększać wpływ i próbuj łączyć niskie ustalenia > z czymś, co ma wpływ
- Mniej uczęszczana droga prowadzi do owocnych odkryć… znajdź ją :)