Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Origen cruzado: qué permite una política CORS laxa

5 tareas · 40 min · Principiante

El navegador separa los sitios por origen: esquema, nombre y puerto. Una página de un origen no puede leer lo que responde otro, salvo que el servidor lo autorice con las cabeceras de CORS. Esta sala lee las variaciones de la cabecera Origin que el evaluador repitió con la cuenta de prueba A en la API de Boletería Jerusalén, que vende boletas para conciertos y teatro, y separa la política abierta que no importa de la que entrega datos de la cuenta a cualquier sitio. Nadie envía nada: se lee lo que quedó registrado.

0 de 5 · 0%

Objetivo de la sala

El navegador separa los sitios por origen: esquema, nombre y puerto. Una página de un origen no puede leer lo que responde otro, salvo que el servidor lo autorice con las cabeceras de CORS. Esta sala lee las variaciones de la cabecera Origin que el evaluador repitió con la cuenta de prueba A en la API de Boletería Jerusalén, que vende boletas para conciertos y teatro, y separa la política abierta que no importa de la que entrega datos de la cuenta a cualquier sitio. Nadie envía nada: se lee lo que quedó registrado.

Dos URL tienen el mismo origen si coinciden en esquema, nombre de host y puerto. https://www.boletas-jerusalen.example y https://api.boletas-jerusalen.example son orígenes distintos aunque pertenezcan a la misma empresa. Por defecto, el código de una página puede enviar peticiones a otro origen, pero el navegador no le entrega la respuesta: la política del mismo origen protege la lectura.

CORS es la forma en que un servidor relaja esa regla. Cuando la petición viene de otro origen, el navegador manda la cabecera Origin y mira la respuesta: si Access-Control-Allow-Origin nombra ese origen (o es *), deja que el código lea el cuerpo. Para algunas peticiones (métodos distintos de GET, HEAD y POST simples, o cabeceras propias) el navegador pregunta antes con una petición previa OPTIONS.

Lo importante para el informe: CORS no impide que la petición llegue al servidor. Decide si el código de otro sitio puede leer lo que vuelve. Por eso no sustituye la protección contra las peticiones forzadas entre sitios (CSRF): una petición simple, de las que no llevan consulta previa, se ejecuta en el servidor aunque la política no deje leer su respuesta.

Responde para continuar

Una API responde sin ninguna cabecera de CORS a una petición que llega desde otro origen. ¿Qué pasa?

Ver pista de ayuda

CORS habla de lo que el navegador entrega al código de la página, no de lo que el servidor recibe.

Con cookies de por medio entran dos cabeceras. La petición tiene que ir con credenciales y la respuesta tiene que traer Access-Control-Allow-Credentials: true. Además, el estándar de Fetch no acepta el comodín en ese caso: si la petición lleva credenciales y la respuesta dice Access-Control-Allow-Origin: *, el navegador no entrega el cuerpo. Por eso un * en una API pública casi nunca es hallazgo: sirve para datos que cualquiera puede ver.

El fallo típico es otro. Para «soportar varios dominios» el servidor copia en Access-Control-Allow-Origin lo que llegue en Origin y añade las credenciales. El resultado es que cualquier sitio que visite una persona con la sesión abierta puede leer, con la cookie de esa persona, lo que la API le devuelve a ella. Falta una condición para que eso ocurra: que la cookie de sesión viaje en una petición entre sitios, cosa que solo hace si está marcada SameSite=None.

Abre el laboratorio, lee cors-pruebas.txt y después cookies.txt.

Responde para continuar

Escribe la ruta del endpoint de la API que devuelve como permitido el origen de prueba del evaluador junto con las credenciales.

Ver pista de ayuda

Compara, petición por petición, el Origin enviado con el Access-Control-Allow-Origin recibido; mira solo las que vienen de un origen que no es de Jerusalén.

Hay contextos en los que el navegador manda Origin: null: documentos abiertos desde un archivo local, ciertas redirecciones y los marcos con atributo de aislamiento. Algunos equipos ponen null en su lista de permitidos «para que funcione el entorno local». El problema es que cualquiera puede fabricar un contexto que envíe ese valor, así que permitir null con credenciales equivale, en la práctica, a permitir a todo el mundo.

En la misma exportación hay un endpoint que rechaza el origen del evaluador pero acepta el nulo. Fíjate en qué devuelve.

Responde para continuar

Escribe la ruta del endpoint que acepta el origen nulo con credenciales.

Ver pista de ayuda

Busca la palabra null en cors-pruebas.txt y comprueba que la respuesta trae también la cabecera de credenciales.

La API de socios también refleja el origen y también dice true en las credenciales. Antes de copiar el mismo hallazgo, mira cómo se autentica. El navegador adjunta solo las cookies; una cabecera Authorization con un token la tiene que poner el propio código de la página, y el código de otro sitio no conoce ese token.

Responde para continuar

¿Cómo valoras la respuesta de la API de socios (P-06)?

Ver pista de ayuda

Pregúntate qué credencial adjuntaría el navegador por su cuenta si la petición la lanzara otro sitio.

P-07 muestra una tercera forma de fallar: la regla acepta cualquier origen que empiece por el nombre del sitio, y https://www.boletas-jerusalen.example.origen-evaluador.example es un dominio del evaluador, no de Jerusalén. Las comprobaciones con «empieza por», «termina en» o «contiene» se saltan registrando un nombre que cumpla el patrón. La corrección se escribe para los tres casos a la vez.

Responde para continuar

¿Qué corrección recomiendas para P-03, P-05 y P-07?

Ver pista de ayuda

Una de las opciones el navegador la rechazaría; otra sigue aceptando dominios ajenos que cumplan el patrón.

Inicia sesión para registrar tus puntos y progreso en el ranking.

Whoami-Labs Pro

Whoami-Labs Pro utiliza cookies

Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad