Bypassing SOP with Iframes - 2
Iframes στο SOP-2
Στην λύση για αυτήν την πρόκληση, @Strellic_ προτείνει μια παρόμοια μέθοδο με την προηγούμενη ενότητα. Ας το ελέγξουμε.
Σε αυτήν την πρόκληση, ο επιτιθέμενος χρειάζεται να παρακάμψει αυτό:
Αν το κάνει, μπορεί να στείλει ένα postmessage με περιεχόμενο HTML που θα γραφεί στη σελίδα με το innerHTML
χωρίς απολύτως καθαρισμό (XSS).
Ο τρόπος να παρακάμψετε τον πρώτο έλεγχο είναι να καθορίσετε το window.calc.contentWindow
σε undefined
και το e.source
σε null
:
Το
window.calc.contentWindow
είναι στην πραγματικότητα τοdocument.getElementById("calc")
. Μπορείτε να αντικαταστήσετε τοdocument.getElementById
με<img name=getElementById />
(σημειώστε ότι το Sanitizer API -εδώ- δεν έχει ρυθμιστεί για να προστατεύει από επιθέσεις DOM clobbering στην προεπιλεγμένη του κατάσταση).Συνεπώς, μπορείτε να αντικαταστήσετε το
document.getElementById("calc")
με<img name=getElementById /><div id=calc></div>
. Έτσι, τοwindow.calc
θα είναιundefined
.Τώρα, χρειαζόμαστε το
e.source
να είναιundefined
ήnull
(επειδή χρησιμοποιείται το==
αντί για το===
,null == undefined
είναιTrue
). Αυτό είναι "εύκολο" να το πετύχετε. Αν δημιουργήσετε ένα iframe και στείλετε ένα postMessage από αυτό και αμέσως το αφαιρέσετε, τοe.origin
θα είναιnull
. Ελέγξτε τον παρακάτω κώδικα
Για να παρακάμψετε τον δεύτερο έλεγχο για το token, στέλνετε το token
με την τιμή null
και καθορίζετε την τιμή του window.token
ως undefined
:
Η αποστολή του
token
στο postMessage με την τιμήnull
είναι απλή.Το
window.token
καλεί τη συνάρτησηgetCookie
που χρησιμοποιεί τοdocument.cookie
. Σημειώστε ότι οποιαδήποτε πρόσβαση στοdocument.cookie
σε σελίδες με προέλευσηnull
προκαλεί ένα σφάλμα. Αυτό θα καθιστά την τιμή τουwindow.token
undefined
.
Η τελική λύση από τον @terjanq είναι η ακόλουθη:
Last updated