Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Mensajería entre ventanas sin validar el origen

5 tareas · 40 min · Principiante

Las páginas modernas conversan con marcos y ventanas de otros orígenes: el widget de pago avisa que el cobro terminó, el chat de ayuda pide abrir un artículo, el portal de aliados recibe la sesión. Ese canal salta a propósito la separación entre orígenes, así que la seguridad depende de dos líneas de código: la que comprueba quién manda el mensaje y la que decide a quién se le manda. Esta sala lee el código del cliente web de Boletería Jerusalén, entregado por la empresa, y encuentra qué receptor no pregunta, cuál pregunta mal y qué se envía a cualquiera.

0 de 5 · 0%

Objetivo de la sala

Las páginas modernas conversan con marcos y ventanas de otros orígenes: el widget de pago avisa que el cobro terminó, el chat de ayuda pide abrir un artículo, el portal de aliados recibe la sesión. Ese canal salta a propósito la separación entre orígenes, así que la seguridad depende de dos líneas de código: la que comprueba quién manda el mensaje y la que decide a quién se le manda. Esta sala lee el código del cliente web de Boletería Jerusalén, entregado por la empresa, y encuentra qué receptor no pregunta, cuál pregunta mal y qué se envía a cualquiera.

Una ventana envía con postMessage(datos, destino). El segundo argumento es el origen al que se quiere entregar: si la ventana de destino ya no está en ese origen (porque navegó a otro sitio), el navegador descarta el mensaje. Con '*' el mensaje se entrega a lo que haya en esa ventana en ese momento, sea quien sea.

La ventana que recibe registra un oyente del evento message. El evento trae origin, el origen real de quien envió, que el navegador rellena y el emisor no puede falsificar, y data, que es lo que el emisor quiso mandar y puede ser cualquier cosa. La regla es simple: el receptor compara origin con el origen esperado, completo y exacto, antes de hacer nada, y trata data como entrada no confiable.

La guía de pruebas web de OWASP trata este canal en su capítulo de pruebas del lado cliente, como prueba de mensajería web.

Responde para continuar

¿Qué dato del evento debe usar el receptor para decidir si confía en un mensaje?

Ver pista de ayuda

Uno de los tres lo escribe el propio emisor.

Abre el laboratorio y lee app-cuenta-extracto.txt. Hay tres receptores registrados en la página de la cuenta. Para cada uno, busca la primera línea dentro de la función: ¿mira evento.origin antes de actuar?

Un receptor que no lo mira acepta órdenes de cualquier página que tenga una referencia a esta ventana, por ejemplo una que la abrió o que la tiene dentro de un marco.

Responde para continuar

Escribe el nombre del receptor que actúa sin comprobar el origen del mensaje.

Ver pista de ayuda

Busca origin en el extracto y anota qué funciones no lo usan.

Comprobar el origen con indexOf, includes, startsWith o endsWith sobre un trozo del nombre es casi tan malo como no comprobarlo: el atacante registra un dominio que contenga ese trozo y pasa el filtro. Después mira qué hace el receptor con data. Si lo que llega acaba en una función que escribe HTML, el filtro débil es la única barrera entre un sitio ajeno y la ejecución de código en la página de la cuenta.

Lee también auxiliares-extracto.txt.

Responde para continuar

Escribe el nombre del receptor cuya comprobación de origen acepta cualquier dominio que contenga el nombre esperado.

Ver pista de ayuda

Compara cómo se escribe la condición del origen en cada receptor que sí lo mira.

El otro lado del canal también falla. Cuando la página envía con destino '*', confía en que la ventana de destino sigue siendo la que abrió. Si esa ventana navegó a otro sitio, o si quien la abrió no era quien se creía, el mensaje le llega igual. Para datos públicos da lo mismo; para una credencial, no.

Responde para continuar

Escribe el nombre del dato sensible que la página envía sin fijar el origen de destino.

Ver pista de ayuda

Busca la llamada que usa el asterisco como segundo argumento y mira qué objeto envía.

La corrección tiene que cerrar las dos mitades del problema de ese receptor: quién puede hablarle y qué hace con lo que recibe. ventanas.txt dice cuál es el origen real del widget de pago.

Responde para continuar

¿Qué corrección recomiendas para el receptor del widget de pago?

Ver pista de ayuda

Una opción sigue siendo una comparación parcial; otra confía en algo que el emisor escribe y que viaja en el código del cliente.

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