Blocking main page to steal postmessage

htARTE (HackTricks AWS Red Team Expert) के साथ जीरो से हीरो तक AWS हैकिंग सीखें!

Iframes के साथ RCs जीतना

इस Terjanq writeup के अनुसार, नल उत्पत्तियों से बनाए गए ब्लॉब दुर्भाग्य से सुरक्षा लाभ के लिए अलग होते हैं, जिसका मतलब है कि यदि आप मुख्य पेज को व्यस्त रखते हैं, तो आईफ्रेम पेज को निष्क्रिय किया जाएगा।

मूल रूप से उस चुनौती में एक अलग आईफ्रेम को निष्क्रिय किया जाता है और उसके बाद जब यह लोड होता है, मुख्य पेज एक पोस्ट संदेश भेजेगा जिसमें ध्वज होगा। हालांकि, इस postmessage संचार में XSS के लिए वंशावली है (आईफ्रेम JS कोड को निष्क्रिय कर सकता है)।

इसलिए, हमले करने वाले का लक्ष्य है कि मुख्य आईफ्रेम बनाए, लेकिन पहले ही मुख्य पेज संवेदनशील डेटा (ध्वज) भेजने से पहले उसे व्यस्त रखें और पेलोड आईफ्रेम को भेजें। जब तक मुख्य व्यस्त है, आईफ्रेम पेलोड को निष्क्रिय करेगा जो कुछ JS होगा जो मुख्य postmessage संदेश को सुनेगा और ध्वज लीक करेगा। अंततः, आईफ्रेम ने पेलोड को निष्क्रिय किया है और मुख्य पेज व्यस्त होना बंद कर देता है, इसलिए वह ध्वज भेजता है और पेलोड इसे लीक करता है।

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

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

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

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

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

Last updated