Omijanie 2FA/MFA/OTP
Tip
Ucz się i ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Przejrzyj pełny katalog HackTricks Training.Wesprzyj HackTricks
- Sprawdź plany subskrypcji!
- Dołącz do 💬 grupy Discord, grupy Telegram, obserwuj @hacktricks_live na X/Twitterze albo odwiedź stronę na LinkedIn i kanał YouTube.
- Dziel się trikami hakerskimi, przesyłając PR-y do repozytoriów GitHub HackTricks i HackTricks Cloud.
Zaawansowane techniki omijania uwierzytelniania dwuskładnikowego
Bezpośredni dostęp do endpointu
Zobacz Proxmox VE, aby zapoznać się z przykładem specyficznym dla produktu, dotyczącym stanu TFA wybieranego przez klienta.
Spróbuj bezpośrednio wywołać endpoint dostępny po zalogowaniu i sprawdź, czy serwer — a nie tylko interfejs użytkownika — wymaga ukończenia procesu MFA. Jeśli aplikacja nieprawidłowo ufa metadanym nawigacji, sprawdź też poprawnie zapisaną nazwę nagłówka HTTP Referer; bezpieczna implementacja nie może używać go jako dowodu przejścia MFA.[2][5]
Ponowne użycie tokenu
Ponowne użycie wcześniej wykorzystanych tokenów do uwierzytelniania na koncie może być skuteczne.[2]
Użycie niewykorzystanych tokenów
Sprawdź, czy niewykorzystany token wygenerowany dla własnego konta testowego jest nieprawidłowo akceptowany dla innego autoryzowanego konta testowego. Pozwala to sprawdzić, czy OTP jest powiązany z właściwym kontem, sesją, przeznaczeniem i transakcją.[2][5]
Ujawnienie tokenu
Sprawdź, czy token nie jest ujawniany w odpowiedzi aplikacji webowej.[2]
Wykorzystanie linku weryfikacyjnego
Użycie linku weryfikacyjnego wysłanego e-mailem podczas tworzenia konta może umożliwić dostęp do profilu bez 2FA, jak opisano w szczegółowym poście.[3]
Manipulacja sesją
Rozpocznij sesje dla dwóch autoryzowanych kont testowych, ukończ MFA w jednej z nich i sprawdź, czy stanu ukończenia MFA nie można przenieść do drugiej sesji. Backend musi powiązać wynik MFA z tym samym kontem i sesją sprzed uwierzytelnienia.[5]
Mechanizm resetowania hasła
Warto sprawdzić, czy funkcja resetowania hasła, która po resecie loguje użytkownika do aplikacji, pozwala wielokrotnie użyć tego samego linku. Zalogowanie się przy użyciu nowo ustawionych danych uwierzytelniających może ominąć 2FA.[2]
Przejęcie platformy OAuth
Sprawdź, czy federacyjna ścieżka logowania OAuth/OIDC wymaga poziomu wiarygodności równoważnego ścieżce logowania hasłem i MFA w aplikacji. Kontrola nad zewnętrznym kontem tożsamości może ominąć lokalne MFA aplikacji tylko wtedy, gdy strona ufająca akceptuje słabszą sesję federacyjną.[5]
Brute Force
Brak limitu szybkości
Brak limitu liczby prób wpisania kodu umożliwia ataki Brute Force, choć należy uwzględnić możliwość cichego ograniczania liczby prób.[1][2]
Pamiętaj, że nawet jeśli limit szybkości jest włączony, warto sprawdzić, czy odpowiedź różni się po przesłaniu prawidłowego OTP. W tym poście łowca błędów odkrył, że mimo uruchomienia limitu szybkości po 20 nieudanych próbach i zwracania odpowiedzi 401, po przesłaniu prawidłowego kodu otrzymał odpowiedź 200.[4]
Powolny Brute Force
Powolny atak Brute Force jest możliwy, gdy limity szybkości dotyczą poszczególnych przepływów, ale nie ma ogólnego limitu szybkości.[1]
Reset limitu ponownego wysyłania kodu
Ponowne wysłanie kodu resetuje limit szybkości, umożliwiając kontynuowanie prób Brute Force.[1]
Omijanie limitu szybkości po stronie klienta
Jeśli ograniczanie liczby prób jest zaimplementowane wyłącznie w JavaScript, odtwórz żądanie bezpośrednio i sprawdź, czy serwer niezależnie egzekwuje limity dla konta, sesji oraz ogólne limity zapobiegające nadużyciom.[1][5]
Brak limitu szybkości dla działań wewnętrznych
Limity szybkości mogą chronić próby logowania, ale nie wewnętrzne działania na koncie.[1]
Koszty ponownego wysyłania kodów SMS
Nadmierne ponawianie wysyłki kodów SMS generuje koszty dla firmy, ale nie omija 2FA.
Nieograniczone generowanie OTP
Nieograniczone generowanie OTP z prostymi kodami umożliwia Brute Force poprzez ponawianie prób z niewielkim zestawem kodów.[1]
Wykorzystanie Race Condition
Wyślij równocześnie ten sam OTP lub kod odzyskiwania i sprawdź, czy jego weryfikacja i zużycie są atomowe. Race Condition występuje, jeśli więcej niż jedno żądanie może wykorzystać tę samą wartość jednorazową.[5]
Luki CSRF/Clickjacking
Badanie luk CSRF lub Clickjacking, które pozwalają wyłączyć 2FA, jest skuteczną strategią.[1][2]
Wykorzystanie funkcji “Remember Me”
Przewidywalne wartości cookie
Zgadnięcie wartości cookie “remember me” może ominąć zabezpieczenia.[1]
Podszywanie się pod adres IP
Podszywanie się pod adres IP ofiary za pomocą nagłówka X-Forwarded-For może ominąć zabezpieczenia.[1]
Użycie starszych wersji
Subdomeny
Sprawdź, czy subdomeny udostępniają starsze aplikacje lub ścieżki uwierzytelniania, w których nie obowiązuje obecny wymóg MFA.[1]
Endpointy API
Starsze wersje API, wskazywane przez ścieżki katalogów /v*/, mogą być podatne na metody omijania 2FA.[1]
Obsługa wcześniejszych sesji
Kończenie istniejących sesji po włączeniu 2FA chroni konta przed nieautoryzowanym dostępem z przejętych sesji.[1]
Błędy kontroli dostępu związane z kodami zapasowymi
Natychmiastowe generowanie kodów zapasowych po włączeniu 2FA oraz możliwość ich nieautoryzowanego pobrania, zwłaszcza przy błędnej konfiguracji CORS lub lukach XSS, stanowią zagrożenie.[1][2]
Ujawnienie informacji na stronie 2FA
Ujawnienie poufnych informacji (np. numeru telefonu) na stronie weryfikacji 2FA stanowi zagrożenie.[1]
Wyłączenie 2FA przez resetowanie hasła
Potencjalna metoda obejścia polega na utworzeniu konta, włączeniu 2FA, zresetowaniu hasła, a następnie zalogowaniu się bez wymogu 2FA.[2]
Żądania-wabiki
Wykorzystanie żądań-wabików do zamaskowania prób Brute Force lub wprowadzenia w błąd mechanizmów ograniczania liczby prób stanowi dodatkową metodę omijania zabezpieczeń. Tworzenie takich żądań wymaga dokładnego zrozumienia zabezpieczeń aplikacji i mechanizmów ograniczania liczby prób.
Błędy konstrukcji OTP
Jeśli OTP jest wyprowadzany wyłącznie z przewidywalnych lub dostarczanych przez klienta danych, użytkownik może być w stanie go odtworzyć. Sprawdź, czy kody są generowane na podstawie kryptograficznie bezpiecznego sekretu, są krótkotrwałe i jednorazowe oraz powiązane z właściwym kontem i działaniem.[5]
Brak wymuszania uwierzytelniania step-up (acr, amr, auth_time)
Niektóre aplikacje pozwalają użytkownikom logować się słabą metodą, a następnie wymagają MFA lub ponownego logowania dopiero przed wrażliwym działaniem (zmianą adresu e-mail, dodaniem odbiorcy płatności, eksportem danych, otwarciem panelu administratora). Nazywa się to uwierzytelnianiem step-up. W przypadku OpenID Connect lub OAuth działa to zazwyczaj tak:
- Klient prosi dostawcę tożsamości o silniejsze uwierzytelnienie, przekazując
acr_values=<level>i/lubmax_age=<seconds>w żądaniu autoryzacji.[6] - Token ID lub profil tokenu dostępu zawierający kontekst uwierzytelnienia może określać, co się wydarzyło:
acr(spełniony poziom uwierzytelnienia),amr(użyte metody, np.["pwd","otp"]) iauth_time(czas uwierzytelnienia użytkownika). Nie wszystkie te claims występują w każdym tokenie.[6] - API wymagające silniejszego uwierzytelnienia odpowiada kodem
401i nagłówkiemWWW-Authenticate: Bearer error="insufficient_user_authentication", acr_values="...", max_age=..., a następnie musi sprawdzićacriauth_timew otrzymanym tokenie.[7]
acr_values to tylko żądanie. Klient (lub API) musi sprawdzić otrzymane claims. OIDC Core zaleca klientowi sprawdzenie, czy wartość acr jest odpowiednia, oraz sprawdzenie auth_time i zażądanie ponownego uwierzytelnienia, jeśli upłynęło zbyt dużo czasu.[6] Jeśli tego nie zrobi, można pominąć step-up.
Testy black-box z użyciem konta testowego, dla którego włączono MFA:
- Przechwyć żądanie autoryzacji step-up i usuń
acr_values/max_agealbo zmieńacr_valuesna słabszą wartość (na przykład zmfaluburn:...:loa:2na wartość widoczną podczas zwykłego logowania). Dokończ logowanie bez MFA i użyj uzyskanego wyniku do wykonania wrażliwego działania. - Bezpośrednio wywołaj wrażliwy endpoint przy użyciu tokenu lub sesji ze zwykłego logowania (niska wartość
acr,amrbezotp/mfa). Żądanie musi zostać odrzucone i wywołać step-up. - Użyj tokenu, którego
auth_timejest starsze niż wymaganemax_age(zaloguj się, odczekaj, a następnie spróbuj wykonać działanie). - Po jednym udanym step-up (np. wyświetleniu klucza API) użyj ponownie tej samej „podwyższonej” sesji lub tokenu do innych wrażliwych działań oraz do tego samego działania po dłuższym czasie. Sprawdź, czy podwyższony stan jest ograniczony do jednego działania i wygasa.
- Jeśli aplikacja przechowuje wynik step-up we fladze po stronie klienta (
"mfaVerified": true, cookieelevated=1, pole w niepodpisanym tokenie), zmień ją ręcznie.
Podatność występuje, gdy wrażliwe działanie udaje się bez silniejszego acr/amr albo z auth_time starszym niż dozwolony. W przypadku ponownego użycia flagi podwyższonej sesji w niezwiązanych funkcjach zobacz też ponowne użycie stanu autoryzacji w zakresie sesji.
References
- [1] Uwierzytelnianie dwuskładnikowe: testowanie bezpieczeństwa i możliwe obejścia
- [2] Obejście uwierzytelniania dwuskładnikowego
- [3] Za kulisami błędu bezpieczeństwa: zagrożenia związane z generowaniem cookie 2FA
- [4] ATO za 2200 USD, który umknął większości łowców błędów, bo zbyt wcześnie zamknęli Intruder
- [5] Ściągawka OWASP dotycząca uwierzytelniania wieloskładnikowego
- [6] OpenID Connect Core 1.0
- [7] RFC 9470 - Protokół wyzwania uwierzytelniania step-up OAuth 2.0
Tip
Ucz się i ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Przejrzyj pełny katalog HackTricks Training.Wesprzyj HackTricks
- Sprawdź plany subskrypcji!
- Dołącz do 💬 grupy Discord, grupy Telegram, obserwuj @hacktricks_live na X/Twitterze albo odwiedź stronę na LinkedIn i kanał YouTube.
- Dziel się trikami hakerskimi, przesyłając PR-y do repozytoriów GitHub HackTricks i HackTricks Cloud.


