Reset de Contraseña Inseguro
Tokens de reset de contraseña sin expiración, sin enforcing de uso único o sin aleatoriedad adecuada — permitiendo a atacantes usar links filtrados o predecibles para tomar control de cuentas.
Cómo Funciona
Los tokens de reset de contraseña son credenciales temporales. Si no expiran, un token en un email viejo puede usarse años después. Si no se invalidan después de usarse, el mismo link puede resetear la contraseña múltiples veces. Si el token se deriva de datos predecibles (ID de usuario, email, timestamp), un atacante puede generar tokens válidos sin recibir el email.
// MAL: token predecible, sin expiración, no invalidado después de usar
async function crearTokenReset(email: string) {
const token = Buffer.from(email + Date.now()).toString('base64');
await db.users.update({ where: { email }, data: { resetToken: token } });
await sendResetEmail(email, token);
}// BIEN: token aleatorio, TTL corto, uso único
async function crearTokenReset(email: string) {
const token = randomBytes(32).toString('hex');
const expiresAt = new Date(Date.now() + 15 * 60 * 1000); // 15 min
const tokenHash = createHash('sha256').update(token).digest('hex');
await db.passwordResets.create({ data: { email, tokenHash, expiresAt, used: false } });
await sendResetEmail(email, token);
}Ejemplo Real
La toma de cuentas via reset de contraseña fue el vector principal en múltiples brechas de alto perfil. El patrón es simple: el atacante conoce el email del objetivo, solicita un reset, y si el token es predecible o no expira, la cuenta es tomada sin necesitar el email.
Cómo Prevenirlo
- Usa tokens criptográficamente aleatorios (crypto.randomBytes(32))
- Configura una expiración corta — 15 minutos es estándar para reset de contraseña
- Invalida el token inmediatamente después de usarse
- Guarda solo el hash del token, no el valor crudo
- Limita la tasa de requests de reset por dirección de email
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Fijación de Sesión
highEl servidor reutiliza el mismo ID de sesión antes y después del login, permitiendo a un atacante que plantó un ID de sesión conocido secuestrar la sesión autenticada.
Sin Bloqueo de Cuenta / Protección contra Fuerza Bruta
mediumEndpoints de login sin rate limiting ni mecanismo de bloqueo, permitiendo a atacantes probar combinaciones ilimitadas de usuario y contraseña hasta encontrar credenciales válidas.
Política de Contraseña Débil
mediumSin requisitos de longitud mínima, complejidad o verificación contra contraseñas comunes en el registro o cambio de contraseña, haciendo las cuentas fácilmente vulnerables a fuerza bruta.
OAuth Sin Parámetro State
highFlujo de autorización OAuth implementado sin un parámetro `state` aleatorio, permitiendo ataques CSRF que vinculan la cuenta de una víctima con la identidad OAuth del atacante.