
Cotonti CommentsWidget PHP ऑब्जेक्ट इंजेक्शन भेद्यता (CAN-2026-2035973 / CVE-2026-71294) के लिए सुरक्षित स्थानीय प्रूफ ऑफ कॉन्सेप्ट।
Cotonti के CommentsWidget कार्यान्वयन में पहचाने गए PHP ऑब्जेक्ट इंजेक्शन मुद्दे के लिए सुरक्षित स्थानीय प्रमाण-अवधारण (proof of concept)।
plugins/comments/inc/CommentsWidget.phpभेद्य कोड पथ ci GET पैरामीटर को स्वीकार करता है और हमलावर-नियंत्रित डेटा को base64_decode() के माध्यम से PHP के unserialize() में पास करता है, बिना यह प्रतिबंधित किए कि कौन सी क्लासेस इंस्टैंशिएट की जा सकती हैं।
संकल्पनात्मक रूप से, भेद्य ऑपरेशन यह है:
$ci = @unserialize(base64_decode($ci));
जब एक सीरिएलाइज़्ड ऑब्जेक्ट प्रदान किया जाता है, तो PHP हमलावर-नियंत्रित क्लास को इंस्टैंशिएट कर सकता है और __wakeup() जैसी मैजिक मेथड्स को इनवोक कर सकता है। एक बड़े एप्लिकेशन में यह तब खतरनाक हो सकता है जब उपयुक्त गैजेट क्लासेस उपलब्ध हों।
प्रस्तुत फिक्स डीसेरिएलाइज़ेशन को इसमें बदलता है:
$ci = @unserialize(base64_decode($ci), ['allowed_classes' => false]);
और उपयोग से पहले यह सत्यापित करता है कि परिणामी मान में अपेक्षित array संरचना है।
poc.php तीन स्थानीय परीक्षण करता है:
unserialize() DangerousGadget को इंस्टैंशिएट करता है और उसकी __wakeup() मेथड को ट्रिगर करता है।allowed_classes => false गैजेट क्लास को इंस्टैंशिएट होने से रोकता है और इसलिए __wakeup() साइड इफेक्ट को रोकता है।PoC /tmp/pwned_by_cotonti_poc.txt का उपयोग केवल एक हानिरहित सेंटिनल के रूप में करता है जो दर्शाता है कि __wakeup() निष्पादित हुआ। यह ऑपरेटिंग-सिस्टम कमांड को निष्पादित नहीं करता। id && whoami स्ट्रिंग केवल गैजेट की command प्रॉपर्टी में एक प्लेसहोल्डर मान के रूप में मौजूद है।
serialize() / unserialize() समर्थन वाला PHP CLIकिसी Cotonti इंस्टॉलेशन की आवश्यकता नहीं है क्योंकि भेद्य और फिक्स्ड डीसेरिएलाइज़ेशन व्यवहार सीधे पुनरुत्पादित किया जाता है।
रिपॉज़िटरी डायरेक्टरी से:
php poc.php
अपेक्षित आउटपुट इसके समान है:
[!] DangerousGadget::__wakeup() triggered
[TEST 1] VULNERABLE: __wakeup() executed during unrestricted unserialize().
[TEST 2] FIXED: object instantiation was blocked; no sentinel was created.
[TEST 3] FIXED: invalid serialized structure rejected by validation.
Summary:
- Vulnerable path allows a serialized attacker-controlled object to be instantiated and invokes __wakeup().
- Fixed path uses allowed_classes=false, preventing the gadget class from being instantiated.
- Structural validation rejects values that do not match the expected array shape.
- No real command execution is performed by this PoC; the command property is only a placeholder.
स्क्रिप्ट बाहर निकलने से पहले अपनी सेंटिनल फ़ाइल को हटा देती है।
हमलावर-नियंत्रित डेटा को अप्रतिबंधित PHP unserialize() के साथ डीसेरिएलाइज़ न करें।
इस कोड पथ के लिए, प्रदर्शित शमन उपाय क्लास इंस्टैंशिएशन को अक्षम करना है:
unserialize($data, ['allowed_classes' => false]);
डीसेरिएलाइज़्ड मान को उसकी सामग्री का उपयोग करने से पहले एप्लिकेशन द्वारा अपेक्षित सटीक संरचना के विरुद्ध भी सत्यापित किया जाना चाहिए।
यह रिपॉज़िटरी सुरक्षा अनुसंधान, सत्यापन और रक्षात्मक परीक्षण के लिए है। PoC को केवल उन वातावरणों में चलाएँ जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। अनुमति के बिना सिस्टम को लक्षित करने के लिए इसका उपयोग न करें।
Harsh Raj Singhania — भेद्यता अनुसंधान, प्रमाण-अवधारण, और प्रकटीकरण।