window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versión: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster ya existe') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() thecodest, Author at The Codest - Page 9 of 18

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

  1. Supongamos que la víctima utiliza Facebook, conocido por abrir enlaces a través de target="_blank",
  2. Crea una página viral falsa,
  3. Crear un sitio web de phishing que se parezca a la página de inicio de sesión de Facebook,
  4. 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';
  5. La víctima hace clic en el enlace de Facebook a la página viral,
  6. 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

es_ESSpanish