Vulnerabilidades del Flujo de Reseteo de Contraseñas
Los mecanismos de reseteo de contraseñas son una parte muy importante para la conveniencia de los usuarios en las aplicacaiones web modernas. Sin embargo, su implementación requiere un manejo cuidadosoo de las consideraciones de seguridad.
Email-Based Reset
Cuando un usuario resetea su contraseña, la aplicación le manda un email conteniendo un link de reseteo o token a la cuenta de email registrada del usuario.
Security Question-Based Reset
Involucra al usuario respondiendo una serie de preguntas de seguridad preconfiguradas al crear la cuenta. Si las respuestas son correctas, el sistema deja que el usuario cambie la contraseña.
SMS-Based Reset
Esta es similar a la basada en email pero con el uso del SMS para dar un código o link de reseteo.
Vulnerabilidades
Cada uno de estos métodos tiene sus vulnerabilidades:
- Predictible Tokens: Si los tokens de reseteo usados en los links o SMSs son predecibles o siguen un patrón secuencial, los atacantes pueden adivinar o bruteforcear las URLs.
- Token Expiration Issues: Los tokens que no terminan pronto o inmediatamente después de su uso, son potenciales vectores de ataque.
- Insufficient Validation: Los mecanismos para verificar la identidad del usuario pueden ser débiles o susceptible de explotación si las preguntas son muy comunes.
- Information Disclosure: Cualquier mensaje de error que especifique si el email o nombre de usuario está registrado, puede ayudar a los atacantes a enumerar.
- Insecure Transport: La transmisión del link o token de reseteo mediante conexiones no-HTTPS, pueden exponerlos.
Explotar Tokens Predecibles
Los tokens simples, predecibles o tienen un tiempo de expiración largo, pueden ser vulnerables a la intercepción o fuerza bruta. Por ejemplo, el código de abajo se usa por la aplicación vulnerable en el lab de Tokens Predictibles.
$token = mt_rand(100, 200); $query = $conn->prepare("UPDATE users SET reset_token = ? WHERE email = ?"); $query->bind_param("ss", $token, $email); $query->execute();
Este código configura un PIN de 3 dígitos como token de reseteo. Como no emplea caracteres mixtos, puede ser fácilmente bruteforceado.
Para probar esto vamos a la aplicación.

Navegamos hasta la página de reseteo de contraseña y metemos el email admin@admin.com.

La aplicación responderá con un mensaje de éxito.

Ahora usaremos burpsuite para generar peticiones web de fuerza bruta. Porque si probamos uno aleatorio se ve así:

Arrancamos el ataque:

Esperamos.

Una vez encontrado iniciamos sesión y obtenemos la flag:

