Reverse Tab Nabbing

Support HackTricks

Descripción

En una situación donde un atacante puede controlar el argumento href de una etiqueta <a con el atributo target="_blank" rel="opener" que va a ser clickeada por una víctima, el atacante apunta este enlace a una web bajo su control (un sitio web malicioso). Luego, una vez que la víctima hace clic en el enlace y accede al sitio web del atacante, este sitio web malicioso podrá controlar la página original a través del objeto javascript window.opener. Si la página no tiene rel="opener" pero contiene target="_blank" y tampoco tiene rel="noopener" también podría ser vulnerable.

Una forma regular de abusar de este comportamiento sería cambiar la ubicación de la web original a través de window.opener.location = https://attacker.com/victim.html a una web controlada por el atacante que se parezca a la original, para que pueda imitar el formulario de inicio de sesión del sitio web original y pedir credenciales al usuario.

Sin embargo, ten en cuenta que como el atacante ahora puede controlar el objeto de ventana del sitio web original, puede abusar de ello de otras maneras para realizar ataques más sigilosos (¿quizás modificando eventos de javascript para exfiltrar información a un servidor controlado por él?)

Resumen

Con enlace de retroceso

Enlace entre páginas padre e hijo cuando no se utiliza el atributo de prevención:

https://owasp.org/www-community/assets/images/TABNABBING_OVERVIEW_WITH_LINK.png

Sin enlace de retroceso

Enlace entre páginas padre e hijo cuando se utiliza el atributo de prevención:

https://owasp.org/www-community/assets/images/TABNABBING_OVERVIEW_WITHOUT_LINK.png

Ejemplos

Crea las siguientes páginas en una carpeta y ejecuta un servidor web con python3 -m http.server Luego, accede a http://127.0.0.1:8000/vulnerable.html, haz clic en el enlace y nota cómo la URL del sitio web original cambia.

vulnerable.html
<!DOCTYPE html>
<html>
<body>
<h1>Victim Site</h1>
<a href="http://127.0.0.1:8000/malicious.html" target="_blank" rel="opener">Controlled by the attacker</a>
</body>
</html>
malicious.html
<!DOCTYPE html>
<html>
<body>
<script>
window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
</script>
</body>
</html>
malicious_redir.html
<!DOCTYPE html>
<html>
<body>
<h1>New Malicious Site</h1>
</body>
</html>

Propiedades accesibles

En el escenario donde ocurre un acceso cross-origin (acceso entre diferentes dominios), las propiedades de la instancia de la clase JavaScript window, a la que se hace referencia mediante el objeto JavaScript opener, que pueden ser accedidas por un sitio malicioso están limitadas a las siguientes:

  • opener.closed: Esta propiedad se accede para determinar si una ventana ha sido cerrada, devolviendo un valor booleano.

  • opener.frames: Esta propiedad proporciona acceso a todos los elementos iframe dentro de la ventana actual.

  • opener.length: El número de elementos iframe presentes en la ventana actual es devuelto por esta propiedad.

  • opener.opener: Se puede obtener una referencia a la ventana que abrió la ventana actual a través de esta propiedad.

  • opener.parent: Esta propiedad devuelve la ventana padre de la ventana actual.

  • opener.self: El acceso a la ventana actual se proporciona mediante esta propiedad.

  • opener.top: Esta propiedad devuelve la ventana del navegador más alta.

Sin embargo, en instancias donde los dominios son idénticos, el sitio malicioso obtiene acceso a todas las propiedades expuestas por la referencia del objeto JavaScript window.

Prevención

La información de prevención está documentada en la HTML5 Cheat Sheet.

Referencias

Support HackTricks

Last updated