# Iframes katika XSS, CSP na SOP {{#include ../../banners/hacktricks-training.md}} ## Iframes katika XSS Kuna njia 3 za kuonyesha maudhui ya ukurasa wa iframed: - Kupitia `src` kuashiria URL (URL inaweza kuwa ya asili tofauti au ya asili sawa) - Kupitia `src` kuashiria maudhui kwa kutumia itifaki ya `data:` - Kupitia `srcdoc` kuashiria maudhui **Kufikia Parent & Child vars** ```html ``` ```html ``` Ikiwa utafungua html ya awali kupitia seva ya http (kama `python3 -m http.server`) utaona kwamba skripti zote zitatekelezwa (kama hakuna CSP inayozuia). **mzazi hataweza kufikia `secret` var ndani ya iframe yoyote** na **ni iframes if2 & if3 tu (ambazo zinachukuliwa kuwa za tovuti moja) zinaweza kufikia siri** katika dirisha la asili.\ Tazama jinsi if4 inachukuliwa kuwa na asili `null`. ### Iframes na CSP > [!TIP] > Tafadhali, angalia jinsi katika bypasses zifuatazo jibu la ukurasa wa iframed halina kichwa chochote cha CSP kinachozuia utekelezaji wa JS. Thamani ya `self` ya `script-src` haitaruhusu utekelezaji wa msimbo wa JS ukitumia protokali ya `data:` au sifa ya `srcdoc`.\ Hata hivyo, hata thamani ya `none` ya CSP itaruhusu utekelezaji wa iframes ambazo zinaweka URL (kamili au njia tu) katika sifa ya `src`.\ Kwa hivyo inawezekana kupita CSP ya ukurasa kwa: ```html ``` Note jinsi **CSP ya awali inaruhusu tu utekelezaji wa script ya ndani**.\ Hata hivyo, **ni `if1` na `if2` tu ambazo zitatekelezwa lakini ni `if1` pekee itakayoweza kufikia siri ya mzazi**. ![](<../../images/image (372).png>) Kwa hivyo, inawezekana **kuzidi CSP ikiwa unaweza kupakia faili ya JS kwenye seva na kuipakia kupitia iframe hata na `script-src 'none'`**. Hii inaweza **pia kufanywa kwa kutumia mwisho wa JSONP wa same-site**. Unaweza kujaribu hii na hali ifuatayo ambapo cookie inanyang'anywa hata na `script-src 'none'`. Endesha tu programu na uifungue na kivinjari chako: ```python import flask from flask import Flask app = Flask(__name__) @app.route("/") def index(): resp = flask.Response('') 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 "" if __name__ == "__main__": app.run() ``` ### Payloads Nyingine Zilizopatikana Katika Mwitu ```html ``` ### Iframe sandbox Maudhui ndani ya iframe yanaweza kuwekwa chini ya vizuizi vya ziada kupitia matumizi ya sifa ya `sandbox`. Kwa kawaida, sifa hii haitumiki, ikimaanisha hakuna vizuizi vilivyowekwa. Wakati inapotumika, sifa ya `sandbox` inaweka vizuizi kadhaa: - Maudhui yanachukuliwa kana kwamba yanatoka kwenye chanzo pekee. - Jaribio lolote la kuwasilisha fomu linazuiwa. - Utekelezaji wa scripts unakatazwa. - Upatikanaji wa APIs fulani unazuiliwa. - Inazuia viungo kuingiliana na muktadha mwingine wa kuvinjari. - Matumizi ya plugins kupitia ``, ``, ``, au lebo zinazofanana yanakatazwa. - Usafiri wa muktadha wa juu wa kuvinjari wa maudhui yenyewe unazuiliwa. - Vipengele vinavyosababishwa kiotomatiki, kama vile upigaji wa video au kuzingatia kiotomatiki kwa udhibiti wa fomu, vinazuiwa. Thamani ya sifa inaweza kuachwa kuwa tupu (`sandbox=""`) ili kuweka vizuizi vyote vilivyotajwa hapo juu. Vinginevyo, inaweza kuwekwa kwenye orodha ya thamani maalum zilizotenganishwa kwa nafasi ambazo zinatoa msamaha kwa iframe kutoka kwa vizuizi fulani. ```html ``` ### Credentialless iframes Kama ilivyoelezwa katika [this article](https://blog.slonser.info/posts/make-self-xss-great-again/), bendera ya `credentialless` katika iframe inatumika kupakia ukurasa ndani ya iframe bila kutuma akidi katika ombi huku ikihifadhi sera ya asili sawa (SOP) ya ukurasa ulio pakwa ndani ya iframe. Hii inaruhusu iframe kufikia taarifa nyeti kutoka iframe nyingine katika SOP sawa iliyopakiwa kwenye ukurasa wa mzazi: ```javascript window.top[1].document.body.innerHTML = 'Hi from credentialless'; alert(window.top[1].document.cookie); ``` - Mfano wa unyakuzi: Self-XSS + CSRF Katika shambulio hili, mshambuliaji anajiandaa ukurasa mbaya wenye iframes 2: - Iframe ambayo inachukua ukurasa wa mwathirika na bendera ya `credentialless` yenye CSRF inayosababisha XSS (Fikiria Self-XSS katika jina la mtumiaji): ```html
``` - Iframe nyingine ambayo kwa kweli ina mtumiaji aliyeingia (bila bendera ya `credentialless`). Kisha, kutoka kwenye XSS inawezekana kufikia iframe nyingine kwani zina SOP sawa na kuiba kidaku kwa mfano kwa kutekeleza: ```javascript alert(window.top[1].document.cookie); ``` ### fetchLater Attack Kama ilivyoonyeshwa katika [hiki kifungu](https://blog.slonser.info/posts/make-self-xss-great-again/) API `fetchLater` inaruhusu kuunda ombi litakalotekelezwa baadaye (baada ya muda fulani). Hivyo, hii inaweza kutumika vibaya kwa mfano, kuingia kwa mwathirika ndani ya kikao cha mshambuliaji (kwa kutumia Self-XSS), kuweka ombi la `fetchLater` (kubadilisha nywila ya mtumiaji wa sasa kwa mfano) na kutoka kwenye kikao cha mshambuliaji. Kisha, mwathirika anaingia kwenye kikao chake mwenyewe na ombi la `fetchLater` litatekelezwa, likibadilisha nywila ya mwathirika kuwa ile iliyowekwa na mshambuliaji. Kwa njia hii hata kama URL ya mwathirika haiwezi kupakuliwa kwenye iframe (kwa sababu ya CSP au vizuizi vingine), mshambuliaji bado anaweza kutekeleza ombi katika kikao cha mwathirika. ```javascript var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"}) const minute = 60000 let arr = [minute, minute * 60, minute * 60 * 24, ...] for (let timeout of arr) fetchLater(req,{activateAfter: timeout}) ``` ## Iframes katika SOP Angalia kurasa zifuatazo: {{#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}} {{#include ../../banners/hacktricks-training.md}}