Saltar al contenido
← Volver a hallazgos
Enero de 2026AltaCVSS 7.5 · vector completo y severidad justificada en el informeObjetivo: Aplicación con segundo factor por correoCaso anonimizado, publicado con autorización previa

Bypass de OTP mediante variaciones de mayúsculas en la dirección de correo

La aplicación trataba cada variación de mayúsculas de la dirección de correo como una identidad distinta. Cada una recibía su propio código OTP y su propio contador de intentos.

  • CWE-178
  • CWE-307
  • OTP Bypass
  • 2FA
  • Fuerza bruta

Resumen

RFC 5321 permite que la parte local sea sensible a mayúsculas y, a la vez, desaconseja explotar esa distinción. Los proveedores de correo habituales entregan todas las variantes al mismo buzón. La aplicación no normalizaba la dirección antes de emitir el código.

Un atacante podía mantener decenas de códigos válidos a la vez para la misma cuenta. Los intentos disponibles contra el segundo factor crecían en esa misma proporción, y el límite de tres intentos dejaba de proteger la cuenta.

Detalles técnicos

Generación de códigos paralelos

Cada variación de mayúsculas producía un código propio:

Peticiones: variaciones de mayúsculas
POST /api/auth/request-otp  { "email": "victim@company.com" }  -> código A
POST /api/auth/request-otp  { "email": "Victim@company.com" }  -> código B
POST /api/auth/request-otp  { "email": "VICTIM@company.com" }  -> código C
POST /api/auth/request-otp  { "email": "vIctim@company.com" }  -> código D
...
 
Todos llegan al mismo buzón: victim@company.com
Cada variación tiene su propio límite de 3 intentos

Efecto sobre la fuerza bruta

La parte local del ejemplo tiene seis letras: 64 variaciones posibles, una por cada combinación de mayúsculas y minúsculas. Solo cuentan los caracteres alfabéticos. Cada variación habilita un código válido con tres intentos:

Cálculo de probabilidad
Código OTP: 6 dígitos -> 1.000.000 de combinaciones
Límite normal: 3 intentos por código -> 0,0003 % de éxito
 
Con el bypass:
- 64 variaciones de mayúsculas x 1 código cada una = 64 códigos válidos
- Cualquiera de ellos sirve para la misma cuenta
- 64 códigos x 3 intentos = 192 intentos por ronda
 
P(éxito por ronda) = 1 - (1 - 1/1.000.000)^192 ~ 0,019 %
Repitiendo cada 60 s -> en 1 hora ~ 1,1 %, frente al 0,018 % sin el bypass

La emisión en paralelo también anula el aviso al usuario: la víctima recibe decenas de correos de código legítimos. Ya no puede distinguir un intento de acceso ajeno de una petición propia.

Impacto

  • Bypass del segundo factor por multiplicación de códigos válidos
  • Evasión del límite de intentos al generar identidades distintas para el mismo buzón
  • Acceso no autorizado a cuentas protegidas con OTP por correo
  • Saturación del buzón de la víctima con un correo de código por cada variación

Remediación

  • Normalizar la dirección de correo a minúsculas antes de cualquier operación.
  • Aplicar el límite de intentos sobre el correo normalizado, no sobre la cadena tal cual llega.
  • Limitar los códigos activos. Invalidar el anterior al generar uno nuevo para el mismo buzón.
  • Aplicar bloqueo progresivo cuando se acumulen intentos fallidos sobre el mismo buzón, sea cual sea la variante empleada.
  • Migrar a TOTP. Los códigos basados en tiempo no dependen del buzón de correo ni de su entrega.

Referencias

Más análisis

Este vector aparece en cualquier aplicación que no normalice la dirección de correo

Cuéntanos qué activos quieres auditar. Respondemos en menos de 24 horas.

Solicitar auditoríaLlamar