Redirección Abierta del Lado del Cliente
JavaScript que redirige usuarios a URLs tomadas de parámetros de query o fragmentos URL sin validación, habilitando ataques de phishing usando tu dominio confiable como lanzadera.
Cómo Funciona
Los usuarios confían en links de dominios que reconocen. Una redirección abierta permite a un atacante crear una URL como `https://tuapp.com/login?next=https://evil.com/login-falso`. Tu app redirige a evil.com después del login, y la víctima — que vio tu dominio en la URL — confía en el destino. Es phishing usando tu reputación.
// MAL: redirige a URL sin validar de parámetro de query
const { searchParams } = new URL(window.location.href);
const next = searchParams.get('next');
if (next) window.location.href = next; // el atacante controla el destino// BIEN: solo permite paths relativos o destinos del mismo origen
const { searchParams } = new URL(window.location.href);
const next = searchParams.get('next') ?? '/dashboard';
// Asegura que sea un path relativo, no una URL externa
const isRelativo = next.startsWith('/') && !next.startsWith('//');
window.location.href = isRelativo ? next : '/dashboard';Ejemplo Real
Redirección abierta + OAuth es una cadena de ataque clásica: el atacante configura el 'redirect_uri' del callback OAuth para apuntar a tu URL de redirección abierta que apunta a su sitio. Tu app maneja el callback OAuth y luego redirige el access token al servidor del atacante. OWASP documenta esto extensamente.
Cómo Prevenirlo
- Solo permite paths relativos (que empiecen con /) como destinos de redirección
- Si se necesitan redirecciones externas, mantén una allowlist explícita de dominios confiables
- Verifica que la URL destino tenga el mismo origen que tu app usando el constructor URL
- Nunca uses parámetros URL sin validar como destinos de redirección después de callbacks OAuth
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
XSS Basado en DOM
highScripts maliciosos ejecutados al leer datos controlados por el atacante de la URL o APIs del navegador y escribirlos en el DOM usando sinks peligrosos como innerHTML o document.write.
XSS Almacenado
highContenido provisto por el usuario guardado en la base de datos sin sanitizar y renderizado en el navegador como HTML, permitiendo inyección de scripts persistente que se ejecuta para cada usuario que ve el contenido.
PostMessage Sin Verificar Origen
mediumHandlers de window.addEventListener('message') que procesan mensajes sin verificar event.origin, permitiendo que cualquier sitio web envíe comandos al handler de mensajes de tu app.
Clickjacking Avanzado
mediumAusencia de los headers X-Frame-Options y CSP frame-ancestors, combinada con sin lógica de frame-busting en el cliente, dejando la app completamente embebible en iframes maliciosos.