Blocking main page to steal postmessage

Support HackTricks

Winning RCs with Iframes

इस Terjanq writeup के अनुसार, शून्य मूल से बनाए गए ब्लॉब दस्तावेज़ सुरक्षा लाभों के लिए अलग किए जाते हैं, जिसका अर्थ है कि यदि आप मुख्य पृष्ठ को व्यस्त रखते हैं, तो iframe पृष्ठ निष्पादित होगा।

बुनियादी रूप से, उस चुनौती में एक अलग iframe निष्पादित होता है और ठीक बाद में जब यह लोड होता है, तो माता-पिता पृष्ठ एक पोस्ट संदेश के साथ झंडा भेजने वाला है। हालांकि, वह पोस्टमैसेज संचार XSS के लिए संवेदनशील है (iframe JS कोड निष्पादित कर सकता है)।

इसलिए, हमलावर का लक्ष्य है कि माता-पिता को iframe बनाने दें, लेकिन पहले माता-पिता पृष्ठ संवेदनशील डेटा (झंडा) भेजने से पहले इसे व्यस्त रखें और पेलोड को iframe में भेजें। जबकि माता-पिता व्यस्त हैं, iframe पेलोड को निष्पादित करता है जो कुछ JS होगा जो माता-पिता के पोस्टमैसेज संदेश को सुनता है और झंडा लीक करता है। अंत में, iframe ने पेलोड को निष्पादित किया और माता-पिता का पृष्ठ व्यस्त रहना बंद कर देता है, इसलिए यह झंडा भेजता है और पेलोड इसे लीक करता है।

लेकिन आप माता-पिता को व्यस्त कैसे रख सकते हैं जब उसने iframe उत्पन्न किया और बस जब वह संवेदनशील डेटा भेजने के लिए iframe के तैयार होने की प्रतीक्षा कर रहा है? बुनियादी रूप से, आपको ऐसी असिंक्रोनस क्रिया खोजने की आवश्यकता है जिसे आप माता-पिता को निष्पादित करने के लिए बना सकें। उदाहरण के लिए, उस चुनौती में माता-पिता इस तरह के पोस्टमैसेज सुन रहा था:

window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});

इसलिए एक बड़ा पूर्णांक पोस्टमैसेज में भेजना संभव था जो उस तुलना में स्ट्रिंग में परिवर्तित होगा, जिसमें कुछ समय लगेगा:

const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);

और सटीकता से postmessage को iframe के बनने के बाद लेकिन parent से डेटा प्राप्त करने के लिए तैयार होने से पहले भेजने के लिए, आपको setTimeout के मिलीसेकंड के साथ खेलना होगा।

Support HackTricks

Last updated