GiveWP WordPress प्लगइन में PHP ऑब्जेक्ट इंजेक्शन के लिए शैक्षिक CVE-2024-12877 एक्सप्लॉइट डेमो। इसमें रूट कॉज़ विश्लेषण, regex बायपास तकनीकें और सुरक्षित एक्सप्लॉइटेशन प्रथाएँ शामिल हैं।
सप्ताह 66 | लेखक: Ali Soltani (soltanali0))
GO-TO CVE श्रृंखला के सप्ताह 66 में आपका स्वागत है, जहाँ हम कमजोरियों का विश्लेषण करते हैं, मूल कारणों की जाँच करते हैं, और एक सुरक्षित, शैक्षिक संदर्भ में व्यावहारिक शोषण तकनीकों का प्रदर्शन करते हैं।
CVE-2024-12877 GiveWP में एक PHP Object Injection कमजोरी है, जो सबसे व्यापक रूप से उपयोग किए जाने वाले WordPress दान प्लगइन्स में से एक है। उपयोगकर्ता-नियंत्रित इनपुट पर unserialize() के असुरक्षित उपयोग से हमलावर PHP मैजिक मेथड्स (जैसे __wakeup()) को ट्रिगर कर सकते हैं, जिससे संभावित रूप से:
CVSS: 9.8 Critical | Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
GiveWP हजारों चैरिटी वेबसाइटों, NGO और फंडरेज़िंग प्लेटफ़ॉर्म को संचालित करता है। चूँकि यह संवेदनशील वित्तीय और दाता डेटा संभालता है, यहाँ की कोई भी कमजोरी अत्यंत प्रभावशाली होती है। ऑब्जेक्ट इंजेक्शन का शोषण करने वाला हमलावर एक एकल प्लगइन से आगे बढ़कर पूरे WordPress इंस्टॉलेशन और अंतर्निहित सर्वर से समझौता कर सकता है।
मूल कारण: अविश्वसनीय इनपुट पर unserialize()।
PHP मैजिक मेथड्स: PHP ऑब्जेक्ट जीवनचक्र के दौरान इन्हें स्वचालित रूप से लागू करता है:
यह कमजोरी उपयोगकर्ता-नियंत्रित इनपुट पर PHP फ़ंक्शन unserialize() के असुरक्षित उपयोग से उत्पन्न होती है। जबकि unserialize() को PHP डेटा संरचनाओं को पुनर्निर्मित करने के लिए डिज़ाइन किया गया है, इसका एक खतरनाक दुष्प्रभाव है: जब ऑब्जेक्ट पुनर्निर्मित होते हैं, PHP स्वचालित रूप से मैजिक मेथड्स को लागू करता है।
__wakeup() – जब कोई ऑब्जेक्ट अनसीरियलाइज़ होता है तो ट्रिगर होता है
__destruct(), __toString(), __get/__set(), __call/__callStatic() – दुर्भावनापूर्ण निष्पादन के लिए उपयोग किया जा सकता है
Regex सत्यापन: GiveWP ने सीरियलाइज़्ड इनपुट का पता लगाने के लिए regex जाँचें लागू कीं। जबकि नया regex अधिक डेटा प्रकारों को पकड़ता है, regex विश्वसनीय रूप से ऑब्जेक्ट इंजेक्शन को नहीं रोक सकता।
एक क्राफ्टेड सीरियलाइज़्ड ऑब्जेक्ट के साथ, हमलावर ऑब्जेक्ट प्रॉपर्टीज़ सेट करता है, और PHP स्वयं मैजिक मेथड्स को लागू करके हमलावर के लॉजिक को निष्पादित करता है।
GiveWP ने यह जाँचने के लिए regex-आधारित सत्यापन लागू किया कि इनपुट सीरियलाइज़्ड था या नहीं। पुराना Regex (अधूरा)
• केवल ऐरे और ऑब्जेक्ट को पहचानता था।
• अन्य सीरियलाइज़्ड प्रकार (string, int, bool, float, null) पहचान से बच जाते थे।
• सभी PHP सीरियलाइज़्ड प्रकारों को पहचानता है।
• कुछ तुच्छ पेलोड को रोकता है।
• लेकिन मूल समस्या बनी रहती है: यदि उपयोगकर्ता इनपुट पर unserialize() का उपयोग किया जाता है, तो regex आपको नहीं बचा सकता।
यह स्निपेट दो अलग-अलग regex कार्यान्वयनों की तुलना करने के लिए लिखा गया था:
• is_serialized_old() → पुराना संस्करण, जो केवल ऐरे और ऑब्जेक्ट का पता लगाता है।
• is_serialized_new() → बेहतर संस्करण, जो सभी PHP सीरियलाइज़्ड डेटा प्रकारों (arrays, objects, strings, integers, booleans, floats, और null) को पहचानता है। हम टेस्ट मानों का एक सेट बनाते हैं (array, object, string, integer, boolean, float, null), उन्हें सीरियलाइज़ करते हैं, और फिर प्रत्येक को दोनों regex फ़ंक्शनों के विरुद्ध जाँचते हैं। सरल शब्दों में:
और इस कोड को अपने Docker पर चलाने के बाद ब्राउज़र में यह परिणाम देखें
चरण 1
चरण 2: एक असुरक्षित क्लास बनाएँ
इस क्लास में एक __wakeup() मेथड है जो अनसीरियलाइज़ होने पर स्वचालित रूप से निष्पादित होगी।
चरण 3: पेलोड तैयार करें
चरण 4: आउटपुट फ़ाइल को सेव करने के बाद, इस फ़ाइल पर आप यह एक्सप्लॉइट देख सकते हैं।
एक्सप्लॉइट :
• पुराना Regex: FALSE → पेलोड का पता लगाने में विफल रहा।
• नया Regex: TRUE → इसे सीरियलाइज़्ड इनपुट के रूप में पहचाना।
• निष्पादन: Hello RCE! → पेलोड अनसीरियलाइज़ किया गया, और मैजिक मेथड __wakeup() ने हमलावर-नियंत्रित कोड निष्पादित किया।
रोकथाम • अनट्रस्टेड इनपुट पर unserialize() का उपयोग न करें। इसे json_decode() या अन्य सुरक्षित विकल्पों से बदलें।
• GiveWP और सभी WordPress प्लगइन्स को अपडेट रखें।
• दुर्भावनापूर्ण सीरियलाइज़्ड पेलोड को ब्लॉक करने के लिए Web Application Firewall (WAF) तैनात करें।
• न्यूनतम विशेषाधिकार के सिद्धांत का पालन करें: PHP और डेटाबेस खातों को न्यूनतम आवश्यक अनुमतियों के साथ चलाएँ।
परिणाम:
मुख्य अंतर्दृष्टि: unserialize() को सुरक्षित करने के लिए regex पर कभी भरोसा न करें। सबसे सुरक्षित तरीका है अनट्रस्टेड इनपुट को पूरी तरह से अनसीरियलाइज़ करने से बचना।
unserialize() का उपयोग न करें; json_decode() या अन्य सुरक्षित विकल्पों को प्राथमिकता दें।मैं कमजोरी अनुसंधान और शोषण के लिए समर्पित दो Telegram चैनल चलाता हूँ:
GO-TO CVE साप्ताहिक एपिसोड: हर सप्ताह, हम एक नए CVE में गहराई से उतरते हैं और विस्तृत विश्लेषण, डेमो और अंतर्दृष्टि साझा करते हैं। 🔗 यहाँ जुड़ें
CVEdb – एक्सप्लॉइट संग्रह: यह चैनल CVEs के लिए 1-दिवसीय एक्सप्लॉइट्स और कस्टम PoCs को संग्रहीत करता है। उन शोधकर्ताओं के लिए एक बेहतरीन संसाधन जो सक्रिय शोषण तकनीकों को देखना चाहते हैं। 🔗 CVEdb से जुड़ें
नवीनतम CVEs, शोषण तकनीकों और सुरक्षा अनुसंधान अंतर्दृष्टि से अपडेट रहने के लिए चैनलों को फॉलो करें।