Seguridad de las aplicaciones web. Vulnerabilidad Target="_blank
Lukasz Kolko
El uso de aplicaciones web se ha convertido en algo habitual en todas las sociedades. Tratamos con ellas todos los días. Podemos decir que nos rodean. Las utilizamos en el trabajo, para entretenernos y como herramientas para comunicarnos con los demás. A menudo, como usuarios y como desarrolladores, no nos damos cuenta de la cantidad de vulnerabilidades de seguridad que se descubren cada día en dichas aplicaciones.
La vulnerabilidad analizada en este documento lleva mucho tiempo entre nosotros y, debido a su sencillez, a menudo es subestimada o incluso desconocida por algunos desarrolladores de aplicaciones web.
Casi todas las aplicaciones web contienen enlaces que, al pulsarlos, se abren en una pestaña nueva para no cerrar la pestaña con la página original. Este es un comportamiento preferido porque los creadores quieren que el usuario pase el mayor tiempo posible en la aplicación.
Un ataque que explota esta vulnerabilidad es el llamado "tabnabbing inverso". Se trata de un ataque en el que una página enlazada desde la página objetivo es capaz de sustituir esa página por, por ejemplo, un sitio de phishing.
Escenario de ataque
Supongamos que la víctima utiliza Facebook, conocido por abrir enlaces a través de target="_blank",
Crea una página viral falsa,
Crear un sitio web de phishing que se parezca a la página de inicio de sesión de Facebook,
Ponga el siguiente código en la página viral, por ejemplo, a través de una vulnerabilidad XSS encontrada window.opener.location = 'https://phishing-website/facebook.com';
La víctima hace clic en el enlace de Facebook a la página viral,
La página viral redirige la pestaña de Facebook al sitio web de phishing pidiendo al usuario que inicie sesión de nuevo.
Así, podemos cambiar la pestaña padre de la página de destino infectada por el objeto ventana de la API Web. Normalmente, un ataque implica el uso de varias vulnerabilidades descubiertas y estafas de phishing en paralelo.
El problema
Cuando abrimos una nueva pestaña en el navegador utilizando un enlace con la etiqueta target="_blank" tenemos acceso a nuestro "referente" desde la nueva pestaña. Más concretamente, al atributo Abridor propiedad del Ventana que devuelve una referencia a la ventana que la abrió, nuestra página padre.
Esto se debe al comportamiento del Window.open() función. Con acceso a este atributo, podemos reemplazar fácilmente nuestra página padre. Tenga en cuenta que algunos navegadores modernos pueden hacer que Abrir.ventana en la pestaña de destino como null para evitar este comportamiento.
Código de ejemplo
<code> <a href="https://github.com" target="_blank">Ir a GitHub - enlace infectado</a>const
si (enlace)
link[0].onclick = () => {
if (window) window.opener.location = 'https://stackoverflow.com'
}
Arriba puedes ver el enlace infectado que originalmente abre una nueva pestaña con una página de GitHub pero mientras tanto cambia nuestra página "padre" al sitio de Stackoverflow.
Ejemplo en directo
1. Enlaces HTML
Añadir rel="noopener noreferrer" a la <a> etiqueta.
En rel define la relación entre un recurso enlazado y el documento actual.
noopener indica al navegador que navegue al objetivo sin conceder acceso al padre que lo abrió. Pestaña de destino Abrir.ventana será null.
noreferrer impide que el navegador, al navegar al destino, envíe al padre la dirección o cualquier otro valor como referrer a través de la etiqueta referente encabezado HTTP. Tenga en cuenta que el nombre de esta cabecera HTTP está intencionadamente mal escrito como "referrer".
Para el JavaScript Ventana.abierta puede añadir los valores noopener y noreferrer en el windowFeatures del Ventana.abierta pero los diferentes navegadores pueden responder de manera diferente, por lo que se recomienda hacer Abrir.ventana como null después de usar Window.open() función.