
Moodle 5.2.3 - उच्च - रिमोट - IDOR - core_grades_get_gradeitems छिपे हुए ग्रेड आइटम सूचीबद्ध करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-gradeitems
राइट-अप: https://abraxaslabs.tech/research/moodle-grades-gradeitems
Moodle LMS 5.2.3 - Moodle
वर्ग: IDOR पहुँच: रिमोट
core_grades_get_gradeitems ajax के साथ-साथ आधिकारिक मोबाइल सेवा है, जिसमें services.php में कोई capabilities कुंजी नहीं है। validate_context ही एकमात्र गेट है। फिर grade_item::fetch_all पाठ्यक्रम के प्रत्येक आइटम को डंप करता है। array_filter GRADE_TYPE_NONE, श्रेणी आइटम, और पाठ्यक्रम आइटम को हटा देता है। छिपा हुआ उस फ़िल्टर में नहीं है। सहोदर core_grades_get_grade_tree को पहले से ही moodle/grade:viewall की आवश्यकता है।
एक नामांकित छात्र {courseid} POST करता है और छिपे हुए ग्रेड आइटम के नाम प्राप्त करता है जिन्हें छात्र ग्रेडबुक UI अभी भी छिपाता है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-862 / CWE-200 |
| CVSS | मध्यम: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| उत्पाद | Moodle |
| प्रभावित | 5.2.3 टैग v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| प्रमाणीकरण | नामांकित छात्र (moodle/grade:view; viewall / viewhidden का अभाव) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
लेखक: पाठ्यक्रम में एक नामांकित छात्र। वे {courseid} के साथ AJAX सेवा को POST करते हैं। प्रतिक्रिया में नाम, ID, और श्रेणियाँ होती हैं। रिटर्न स्कीमा में कोई स्कोर नहीं है। RCE नहीं। LPE नहीं। स्कोर राइट नहीं।
| विशेषाधिकार | विधि / सिंक | रेकॉन / अखंडता / उपलब्धता | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
| छिपे हुए ग्रेड-आइटम का नाम, id, और श्रेणी पढ़ें | POST /lib/ajax/service.php?sesskey= core_grades_get_gradeitems {courseid} | रेकॉन | लैब-प्रमाणित। HTTP 200, नामों में MOODLE-GRADES-GRADEITEMS-WITNESS शामिल है |
| दृश्यमान ग्रेड-आइटम का नाम, id, और श्रेणी पढ़ें | वही प्रतिक्रिया | रेकॉन (शिक्षकों के लिए इच्छित) | लैब-प्रमाणित। नामों में Visible Lab Assignment शामिल है |
| आधिकारिक मोबाइल सेवा के माध्यम से वही कैटलॉग | वही क्लास, services में MOODLE_OFFICIAL_MOBILE_SERVICE शामिल है | रेकॉन | services.php से अनुमानित। लैब ने AJAX का उपयोग किया। |
उन पाठ्यक्रमों के लिए क्रमिक courseid मानों को वॉक करें जिनमें छात्र प्रवेश कर सकता है | वही विधि, अनुमानित ids | रेकॉन | अनुमानित। लैब ने सीडेड पाठ्यक्रम id 2 का उपयोग किया |
| छात्र ग्रेडबुक UI में छिपा हुआ आइटम देखें | GET /grade/report/user/index.php?id= | लागू नहीं | लैब-प्रमाणित बंद। hidden-in-ui=False, visible-in-ui=True |
| सत्र के बिना कॉल करें | डमी sesskey के साथ AJAX | लागू नहीं | लैब-प्रमाणित बंद। servicerequireslogin |
| लॉग-इन उपयोगकर्ता के रूप में कॉल करें जो नामांकित नहीं है | बाहरी AJAX, वही courseid | लागू नहीं | लैब-प्रमाणित बंद। requireloginerror |
| अन्य छात्रों के स्कोर पढ़ें या ग्रेड लिखें | लागू नहीं | लागू नहीं | बंद। रिटर्न कुंजियाँ id, itemname, category हैं |
| PHP RCE / OS LPE | लागू नहीं | लागू नहीं | बंद। यह अवशेष एक कैटलॉग रीड है |
एक शिक्षक या प्रबंधक जिसके पास पहले से ही moodle/grade:viewall है, वह पहले से ही कैटलॉग देख सकता है। अतिथि / अप्रमाणित कॉलर्स को अभी भी एक पाठ्यक्रम संदर्भ की आवश्यकता है।
इसी पिन के अवशेष: Blackboard img file read, enrol_database SQLi, grades feedback IDOR।
MSA-26-0042/0043 के बाद मैंने moodle/moodle v5.2.3 को पिन किया। ग्रेड वेब सेवाएँ उस MSA विंडो में थीं। get_gradeitems.php में अभी भी कोई require_capability नहीं है। छात्र UI पहले से ही आइटम को छिपा रहा था। AJAX कैटलॉग नहीं छिपा रहा था।
पहले से दर्ज गलत रास्ते: unauth AJAX 200 को लीक मानना (body servicerequireslogin है); इसे स्कोर IDOR कहना क्योंकि मेथड नाम में grade है (स्कीमा केवल नामों का है); get_grade_tree को वही अवशेष होने की अपेक्षा करना (उसे पहले से ही viewall चाहिए)। एक रिवर्स शेल। नाटक।
php:8.3-apache + MariaDB 11.4 पर लाइव Moodle v5.2.3। सीड labstudent को नामांकित करता है, laboutsider को कोर्स से बाहर रखता है, और एक दृश्यमान मैनुअल आइटम तथा एक छिपा हुआ आइटम बनाता है जिसका नाम ही गवाह है। run.sh एक स्थानीय पिन या git clone --depth 1 --branch v5.2.3 कॉपी करता है। Moodle ट्री इस पैक में नहीं है।
python3 moodle-grades-gradeitems-Abraxas-Labs.py
या
cd lab
./run.sh
केवल http://127.0.0.1:19590 को लक्षित करें। प्रोजेक्ट moodle-grades-gradeitems को कंपोज़ करें। रन के बाद स्टैक टियर डाउन हो जाता है।
SUCCESS moodle-grades-gradeitems student-ajax=200 hidden-in-ajax=yes hidden-in-ui=no visible-in-ajax=yes visible-in-ui=yes outsider-error=yes unauth-error=yes MOODLE-GRADES-GRADEITEMS-WITNESS
validate_context के बाद, get_grade_tree के समान ही कैप की आवश्यकता रखें: require_capability('moodle/grade:viewall', $context)। साथ ही छिपे हुए आइटम तब तक हटा दें जब तक कॉलर के पास moodle/grade:viewhidden न हो। एक Behat/PHPUnit केस जोड़ें: नामांकित छात्र, छिपा हुआ मैनुअल आइटम, core_grades_get_gradeitems को उस आइटम को छोड़ना चाहिए (या 403)। छात्र ग्रेडबुक UI पहले से ही इसे छिपाता है।
get_gradeitems.phpget_grade_tree.phpservices.php (core_grades_get_gradeitems, कोई capabilities नहीं)GNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।