
Moodle 5.2.3 - उच्च - रिमोट - IDOR - core_grades_get_gradeitems छिपे हुए ग्रेड आइटम सूचीबद्ध करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-gradeitems
Moodle LMS 5.2.3 - Moodle
Class: IDOR Reach: Remote
core_grades_get_gradeitems ajax के साथ-साथ आधिकारिक मोबाइल सेवा भी है, जिसमें services.php में कोई capabilities key नहीं है। validate_context ही एकमात्र गेट है। फिर grade_item::fetch_all कोर्स के हर आइटम को डंप कर देता है। array_filter GRADE_TYPE_NONE, category आइटम, और course आइटम को हटा देता है। Hidden उस फ़िल्टर में नहीं है। सहोदर core_grades_get_grade_tree पहले से ही moodle/grade:viewall की मांग करता है।
एक नामांकित छात्र {courseid} POST करता है और उन hidden grade items के नाम प्राप्त कर लेता है जिन्हें छात्र gradebook UI अभी भी छिपाता है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-862 / CWE-200 |
| CVSS | Medium: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| Product | Moodle |
| Affected | 5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Auth | नामांकित छात्र (moodle/grade:view; viewall / viewhidden का अभाव) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
Writer: कोर्स में नामांकित छात्र। वे {courseid} के साथ AJAX सेवा को POST करते हैं। प्रतिक्रिया में नाम, IDs, और categories होते हैं। रिटर्न स्कीमा में कोई स्कोर नहीं है। RCE नहीं। LPE नहीं। स्कोर राइट नहीं।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
| Hidden grade-item का नाम, id, और category पढ़ें | POST /lib/ajax/service.php?sesskey= core_grades_get_gradeitems {courseid} | Recon | Lab-proven। HTTP 200, नामों में MOODLE-GRADES-GRADEITEMS-WITNESS शामिल |
| Visible grade-item का नाम, id, और category पढ़ें | वही प्रतिक्रिया | Recon (शिक्षकों के लिए अभिप्रेत) | Lab-proven। नामों में Visible Lab Assignment शामिल |
| आधिकारिक मोबाइल सेवा पर वही कैटलॉग | वही class, services में MOODLE_OFFICIAL_MOBILE_SERVICE शामिल | Recon | services.php से inferred। Lab ने AJAX का उपयोग किया। |
छात्र जिन कोर्सों में प्रवेश कर सकता है, उनके लिए क्रमिक courseid मानों को वॉक करें | वही method, अनुमानित ids | Recon | Inferred। Lab ने seeded course id 2 का उपयोग किया |
| छात्र gradebook UI में hidden आइटम देखें | GET /grade/report/user/index.php?id= | n/a | Lab-proven closed। hidden-in-ui=False, visible-in-ui=True |
| सत्र के बिना कॉल करें | dummy sesskey के साथ AJAX | n/a | Lab-proven closed। servicerequireslogin |
| नामांकित नहीं ऐसे लॉग-इन उपयोगकर्ता के रूप में कॉल करें | outsider AJAX, वही courseid | n/a | Lab-proven closed। requireloginerror |
| अन्य छात्रों के स्कोर पढ़ें या ग्रेड लिखें | n/a | n/a | Closed। रिटर्न keys id, itemname, category हैं |
| PHP RCE / OS LPE | n/a | n/a | Closed। यह अवशेष एक कैटलॉग रीड है |
एक शिक्षक या प्रबंधक जिसके पास पहले से moodle/grade:viewall है, वह पहले से ही कैटलॉग देख सकता है। Guest / unauthenticated कॉलर्स को अभी भी course context की आवश्यकता होती है।
वही pin अवशेष: Blackboard img file read, enrol_database SQLi, grades feedback IDOR।
MSA-26-0042/0043 के बाद मैंने moodle/moodle v5.2.3 को pin किया। Grade web services उस MSA विंडो में थीं। get_gradeitems.php में अभी भी कोई require_capability नहीं है। छात्र UI पहले से ही आइटम छिपाता था। AJAX कैटलॉग नहीं छिपाता था।
पहले से दर्ज गलत रास्ते: unauth AJAX 200 को लीक मानना (body servicerequireslogin है); इसे score IDOR कहना क्योंकि method नाम में grade है (स्कीमा केवल नाम है); get_grade_tree को वही अवशेष होने की अपेक्षा करना (यह पहले से ही viewall की मांग करता है)। एक reverse shell। नाटक।
php:8.3-apache + MariaDB 11.4 पर लाइव Moodle v5.2.3। Seed labstudent को नामांकित करता है, laboutsider को कोर्स से बाहर रखता है, और एक visible manual आइटम तथा एक hidden आइटम बनाता है जिसका नाम witness है। run.sh एक स्थानीय pin या 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। Compose प्रोजेक्ट 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 के समान cap की मांग करें: require_capability('moodle/grade:viewall', $context)। साथ ही hidden आइटम हटा दें जब तक कॉलर के पास moodle/grade:viewhidden न हो। एक Behat/PHPUnit केस जोड़ें: नामांकित छात्र, hidden manual आइटम, core_grades_get_gradeitems को उस आइटम को छोड़ना चाहिए (या 403)। छात्र gradebook UI पहले से ही इसे छिपाता है।
get_gradeitems.phpget_grade_tree.phpservices.php (core_grades_get_gradeitems, कोई capabilities नहीं)GNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई वारंटी नहीं।