From 0696a5dd7823bfa03d8e7b2aac93a2f0de08b499 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 19 Aug 2025 20:46:03 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xss-cross-site-scripting/iframes-in-xss- --- .../iframes-in-xss-and-csp.md | 94 ++++++++++++++----- 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md b/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md index 6c1aa53de..aae7b7998 100644 --- a/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md +++ b/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md @@ -6,7 +6,7 @@ Iframe'li bir sayfanın içeriğini belirtmenin 3 yolu vardır: -- Bir URL belirten `src` aracılığıyla (URL, farklı kökenli veya aynı kökenli olabilir) +- Bir URL belirten `src` aracılığıyla (URL, çapraz köken veya aynı köken olabilir) - `data:` protokolünü kullanarak içeriği belirten `src` aracılığıyla - İçeriği belirten `srcdoc` aracılığıyla @@ -46,22 +46,22 @@ alert(parent.secret) ``` Eğer önceki html'ye bir http sunucusu (örneğin `python3 -m http.server`) aracılığıyla erişirseniz, tüm scriptlerin çalıştırılacağını göreceksiniz (çünkü bunu engelleyen bir CSP yok). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemeyecek** ve **sadece if2 ve if3 iframe'leri (aynı site olarak kabul edilenler) orijinal penceredeki secret'a erişebilir**.\ -if4'ün `null` kökenine sahip olduğu dikkate alın. +if4'ün `null` kökenine sahip olduğu not edilmelidir. ### CSP ile Iframe'ler > [!TIP] -> Lütfen, aşağıdaki bypass'larda iframed sayfaya verilen yanıtın JS yürütümünü engelleyen herhangi bir CSP başlığı içermediğine dikkat edin. +> Lütfen, aşağıdaki bypass'lerde iframe'li sayfaya yanıtın JS çalıştırılmasını engelleyen herhangi bir CSP başlığı içermediğine dikkat edin. -`script-src`'nin `self` değeri, `data:` protokolü veya `srcdoc` niteliği kullanarak JS kodunun yürütülmesine izin vermeyecektir.\ -Ancak, CSP'nin `none` değeri bile, `src` niteliğinde bir URL (tam veya sadece yol) koyan iframe'lerin yürütülmesine izin verecektir.\ +`script-src`'nin `self` değeri, `data:` protokolü veya `srcdoc` niteliği kullanarak JS kodunun çalıştırılmasına izin vermeyecektir.\ +Ancak, CSP'nin `none` değeri bile, `src` niteliğinde bir URL (tam veya sadece yol) koyan iframe'lerin çalıştırılmasına izin verecektir.\ Bu nedenle, bir sayfanın CSP'sini aşmak mümkündür: ```html +content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk'" /> " if __name__ == "__main__": app.run() ``` -### Diğer Yükler doğada bulundu +#### Yeni (2023-2025) CSP atlatma teknikleri ile iframeler + +Araştırma topluluğu, kısıtlayıcı politikaları aşmak için iframeleri kötüye kullanmanın yaratıcı yollarını keşfetmeye devam ediyor. Aşağıda son birkaç yıl içinde yayımlanan en dikkat çekici teknikleri bulabilirsiniz: + +* **Dangling-markup / named-iframe veri sızıntısı (PortSwigger 2023)** – Bir uygulama HTML'yi yansıttığında ancak güçlü bir CSP script yürütümünü engellediğinde, *dangling* ` + + ``` ### Credentialless iframes -[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) açıklandığı gibi, bir iframe'deki `credentialless` bayrağı, yüklenen sayfanın aynı köken politikasını (SOP) korurken, bir iframe içinde bir sayfayı kimlik bilgileri göndermeden yüklemek için kullanılır. +As explained in [this article](https://blog.slonser.info/posts/make-self-xss-great-again/), the `credentialless` flag in an iframe is used to load a page inside an iframe without sending credentials in the request while maintaining the same origin policy (SOP) of the loaded page in the iframe. -Bu, iframe'in, ana sayfada yüklenen aynı SOP'deki başka bir iframe'den hassas bilgilere erişmesine olanak tanır: +Since **Chrome 110 (Şubat 2023) bu özellik varsayılan olarak etkin** ve spesifikasyon, *anonymous iframe* adı altında tarayıcılar arasında standart hale getirilmektedir. MDN bunu şöyle tanımlıyor: “gerçek kökenle hiçbir çerez, localStorage veya IndexedDB paylaşılmayacak şekilde üçüncü taraf iframeleri yüklemek için yeni, geçici bir depolama bölümü oluşturma mekanizması”. Saldırganlar ve savunucular için sonuçlar: + +* Farklı credentialless iframelerdeki **scriptler hala aynı üst düzey kökeni paylaşır** ve DOM aracılığıyla serbestçe etkileşimde bulunabilir, bu da çoklu iframe self-XSS saldırılarını mümkün kılar (aşağıdaki PoC'ye bakın). +* Ağ **credential-stripped** olduğu için, iframedeki herhangi bir istek etkili bir şekilde kimlik doğrulaması yapılmamış bir oturum gibi davranır – CSRF korumalı uç noktalar genellikle başarısız olur, ancak DOM aracılığıyla sızdırılabilir kamu sayfaları hala kapsamda kalır. +* Credentialless iframeden oluşturulan pop-up'lar, bazı OAuth akışlarını bozarak örtük bir `rel="noopener"` alır. ```javascript -window.top[1].document.body.innerHTML = 'Hi from credentialless'; -alert(window.top[1].document.cookie); +// PoC: two same-origin credentialless iframes stealing cookies set by a third +window.top[1].document.cookie = 'foo=bar'; // write +alert(window.top[2].document.cookie); // read -> foo=bar ``` -- Exploit örneği: Self-XSS + CSRF +- Sömürü örneği: Self-XSS + CSRF Bu saldırıda, saldırgan 2 iframe içeren kötü niyetli bir web sayfası hazırlar: -- `credentialless` bayrağı ile kurbanın sayfasını yükleyen bir iframe ve bir XSS tetikleyen bir CSRF (Kullanıcının kullanıcı adında bir Self-XSS hayal edin): +- `credentialless` bayrağı ile kurbanın sayfasını yükleyen bir iframe ve bir XSS tetikleyen CSRF (Kullanıcının kullanıcı adında bir Self-XSS hayal edin): ```html @@ -165,15 +209,15 @@ document.forms[0].submit(); - Gerçekten kullanıcının giriş yaptığı ( `credentialless` bayrağı olmadan) başka bir iframe. -Sonra, XSS'den diğer iframe'e erişmek mümkündür çünkü aynı SOP'ye sahiptirler ve örneğin çerezi çalmak için şu komutu çalıştırabilirsiniz: +Sonra, XSS'ten diğer iframe'e erişmek mümkündür çünkü aynı SOP'ye sahiptirler ve örneğin çerezi çalmak için şu komutu çalıştırabilirsiniz: ```javascript alert(window.top[1].document.cookie); ``` ### fetchLater Saldırısı -[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) belirtildiği gibi, `fetchLater` API'si bir isteğin daha sonra (belirli bir süre sonra) yürütülmesi için yapılandırılmasına olanak tanır. Bu nedenle, bu, örneğin, bir kurbanı bir saldırganın oturumu içinde (Self-XSS ile) oturum açmak, mevcut kullanıcının şifresini değiştirmek için bir `fetchLater` isteği ayarlamak ve saldırganın oturumundan çıkmak için kötüye kullanılabilir. Ardından, kurban kendi oturumuna giriş yapar ve `fetchLater` isteği yürütülerek, kurbanın şifresi saldırgan tarafından ayarlanan şifreye değiştirilir. +[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) belirtildiği gibi, `fetchLater` API'si bir isteğin daha sonra (belirli bir süre sonra) yürütülmesi için yapılandırılmasına olanak tanır. Bu nedenle, örneğin, bir kurbanı bir saldırganın oturumu içinde (Self-XSS ile) oturum açmak, bir `fetchLater` isteği ayarlamak (örneğin, mevcut kullanıcının şifresini değiştirmek için) ve saldırganın oturumundan çıkmak için kötüye kullanılabilir. Ardından, kurban kendi oturumuna giriş yapar ve `fetchLater` isteği yürütülerek, kurbanın şifresi saldırgan tarafından ayarlanan şifreye değiştirilir. -Bu şekilde, kurbanın URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir. +Bu şekilde, kurban URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir. ```javascript var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"}) const minute = 60000 @@ -183,7 +227,7 @@ fetchLater(req,{activateAfter: timeout}) ``` ## SOP'de Iframe'ler -Aşağıdaki sayfaları kontrol edin: +Aşağıdaki sayfalara göz atın: {{#ref}} ../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md @@ -201,4 +245,10 @@ Aşağıdaki sayfaları kontrol edin: ../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md {{#endref}} + + +## Referanslar + +* [PortSwigger Araştırma – CSP'yi aşmak için form kaçırma kullanma (Mart 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp) +* [Chrome Geliştiricileri – Iframe kimlik bilgisi olmadan: COEP ortamlarında iframe'leri kolayca gömme (Şub 2023)](https://developer.chrome.com/blog/iframe-credentialless) {{#include ../../banners/hacktricks-training.md}}