Moodle 5.2.3 - उच्च - रिमोट - IDOR - core_grades_get_feedback अलग-समूह जाँचों को छोड़ देता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-feedback-idor
Moodle LMS 5.2.3 - Moodle
Class: IDOR Reach: Remote
core_grades_get_feedback अभी भी केवल require_capability('gradereport/grader:view') को कॉल करता है। अन्य ग्रेड वेब सेवाओं को MSA-26-0016 / MDL-88667 के बाद groups_user_groups_visible / groups_group_visible प्राप्त हुए। इस AJAX सेवा को नहीं मिला। JSON feedbacktext, fullname, picture, और पहले पहचान फ़ील्ड के साथ वापस आता है।
Separate groups में एक non-editing teacher, accessallgroups के बिना, किसी अन्य छात्र का userid POST करता है और उस समूह का feedback पढ़ता है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-863 / 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 | non-editing teacher जिसके पास gradereport/grader:view है, बिना moodle/site:accessallgroups के। Course Separate groups में। |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
Writer: एक non-editing teacher जो Separate-groups course में नामांकित है, केवल Group A में, grader view के साथ और access-all-groups के बिना। वे किसी अन्य नामांकित छात्र का userid (क्रमिक ints) चुनते हैं और AJAX सेवा को कॉल करते हैं। RCE नहीं। LPE नहीं। स्कोर write नहीं।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
| किसी अन्य समूह का grade feedback पढ़ना | POST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid} | Recon | Lab-proven। HTTP 200, error=false, feedbacktext में MOODLE-GRADES-FEEDBACK-IDOR-WITNESS है |
| उस छात्र का पहचान फ़ील्ड और display name पढ़ना | वही response additionalfield / fullname / picture | Recon | Lab-proven। [email protected], fullname=Student Bravo |
उसी course में क्रमिक userid मानों को walk करना | वही method, अनुमानित ids | Recon | Inferred। Lab ने seeded Group B id का उपयोग किया |
| sibling selector के माध्यम से Group B को list करना | core_grades_get_gradable_users {courseid, groupid=B} | n/a | Lab-proven closed। cannotaccessgroup |
| छात्र उसी feedback सेवा को कॉल करता है | student role, वही args | n/a | Lab-proven closed। nopermissions |
| Same-group feedback (Group A छात्र) | Student Alpha के लिए teacher call | Recon (intended) | Lab-proven allowed। HTTP 200, error=false |
| PHP RCE / OS LPE / grade write | n/a | n/a | Closed। यह leftover feedback और profile फ़ील्ड्स का read है |
Separate groups के बिना डिफ़ॉल्ट Moodle, या वह teacher जिसके पास पहले से moodle/site:accessallgroups है, यह leftover नहीं है। उस cap वाले editing teachers पहले से ही हर समूह देखते हैं।
Same pin leftovers: Blackboard img file read, enrol_database SQLi, hidden grade items।
मैंने MSA-26-0042/0043 के बाद moodle/moodle v5.2.3 को pin किया। MSA-26-0016 ने अन्य grade web services पर group checks बंद कर दिए। get_feedback.php उस सेट में नहीं था। grader UI को harden किया गया था। इस AJAX सेवा को नहीं।
पहले से दर्ज गलत रास्ते: sibling get_gradable_users miss को पूरी कहानी मानना (वह पहले से ही cannotaccessgroup throw करता है); इसे score write कहना क्योंकि payload में itemid का नाम है (सेवा एक read है); student-as-attacker (nopermissions)। एक reverse shell। Theatre।
php:8.3-cli + MariaDB 11.4 पर Live Moodle v5.2.3। Seed एक Separate-groups course बनाता है, teacher केवल Group A में, student B केवल Group B में, moodle/site:accessallgroups पर CAP_PREVENT, और एक manual grade item जिसका feedback witness है। how=live।
Compose ../../vendors/moodle/src को /opt/moodle-pin के रूप में bind-mount करता है (path lab/docker-compose.yml के सापेक्ष है)। moodle/moodle tag v5.2.3 को उस path पर clone करें, या volume को अपने checkout पर point करें। Moodle tree इस pack में नहीं है।
python3 moodle-grades-feedback-idor-Abraxas-Labs.py
या
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19580। Compose project moodle-grades-feedback-idor। Run के बाद stack tear down हो जाता है।
SUCCESS moodle-grades-feedback-idor how=live pin=v5.2.3 teacher-role=teacher accessallgroups=no groupmode=1 feedback-has-witness=yes [email protected] sibling-group-b=cannotaccessgroup student-call=nopermissions MOODLE-GRADES-FEEDBACK-IDOR-WITNESS
validate_context / require_capability के बाद, course और target user को load करें, फिर refuse करें जब तक groups_user_groups_visible($course, $userid) न हो और target enrolled न हो। MDL-88667 के बाद gradereport_user और core_grades_get_gradable_users के समान shape।
get_feedback.phpget_gradable_users.phpGNU Affero GPL v3.0। LICENSE देखें। केवल Loopback lab। कोई warranty नहीं।