XUT_ / COURSES / PENETRATION TESTER

Exploiting Vulnerable Password Reset Logic

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.

php
$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.

Exploiting Vulnerable Password Reset Logic

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

Exploiting Vulnerable Password Reset Logic

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

Exploiting Vulnerable Password Reset Logic

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

Exploiting Vulnerable Password Reset Logic

Arrancamos el ataque:

Exploiting Vulnerable Password Reset Logic

Esperamos.

Exploiting Vulnerable Password Reset Logic

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

Exploiting Vulnerable Password Reset Logic