Recientemente hemos escrito sobre seguridad de las aplicaciones web en lo que respecta a la vulnerabilidad XSS. Esta vez queremos llamar su atención sobre otro peligro.
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".
2. JavaScript enlaces
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.
Seguir leyendo:
API de Rails y CORS. Una pizca de conciencia
Estrategias de obtención de datos en NextJS
7 razones por las que tu tienda online necesita Magento
Si te parece interesante este artículo, sigue a Lukasz en Github: https://github.com/twistezo