
Moodle 5.2.3 - उच्च - रिमोट - SQLi - enrol_database SQL में course idnumber को संयोजित करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-enrol-database-sqli
Moodle LMS 5.2.3 - Moodle
Class: SQLi Reach: Remote
enrol_database::db_get_sql अभी भी slashes और concatenates करता है। MSA-26-0005 / MDL-88138 ने auth_db को Execute($sql, [$value]) के रूप में parameterized किया। इस plugin ने वह shape copy नहीं किया। settings में defaults: dbsybasequoting=0, localcoursefield=idnumber। sink external enrolment database है। Moodle core $DB इस path पर नहीं है।
enrol_database enabled वाली site पर एक editing teacher course idnumber set करता है। Cron इसे interpolate करता है। enrol DB से extra rows वापस आती हैं।
| ID | अभी कोई CVE नहीं |
| CWE | CWE-89 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Product | Moodle |
| Affected | 5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116)। Plugin enrol_database on होना चाहिए। |
| Auth | editing teacher (course idnumber, default local map) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
enrol_database enabled वाली site पर एक editing teacher course idnumber set करके external enrolment database पर SQL inject करता है। फिर cron sync_enrolments वह SQL चलाता है।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
| external enrol SELECT में SQL fragment splice करना | Cron sync_enrolments -> db_get_sql($table, array($coursefield=>$course->mapping), ...) -> $extdb->Execute($sql) | query string की integrity | Lab-proven। Concat SQL है WHERE courseid = 'LABCOURSE\'' OR 1=1 -- ' |
| उस external DB पर अन्य courses की enrol rows पढ़ना | string close होने के बाद वही SELECT | Recon | Lab-proven। Clean: 1 row teacher-local। Inject: 2 rows जिसमें MOODLE-ENROL-DATABASE-SQLI-WITNESS शामिल है |
| plugin off होने पर query skip करना | वही gadget, plugin=off | n/a | Lab-proven closed। executed=false, खाली SQL, 0 rows |
| वही payload bound parameter के रूप में रखना | MSA-26-0005 का auth_db leftover: Execute($sql, [$value]) | n/a | Lab-proven closed। style=param ने 0 rows return किए, SQL में ? है |
| extra rows में named Moodle users को enrol / unenrol / role-assign करना | cron द्वारा requestedenrols apply करने के बाद | enrolments की integrity | Inferred। Lab enrol DB पर extra rows पर रुक जाता है |
| enrol-DB user के रूप में FILE / INTO OUTFILE | वही sink यदि उस account के पास FILE है | उस DB host की integrity / availability | Inferred। प्रदर्शित नहीं। OS LPE नहीं |
| Student-controlled path | केवल यदि admin localuserfield=email (या समान) map करे | n/a | Inferred। Default path teacher idnumber है |
इस leftover पर closed: Moodle core $DB; plugin disabled (कोई query नहीं); unauthenticated access; OS shell; stacked queries (यह mysqli gadget single-statement है)। enrol_database के बिना default Moodle यह bug नहीं है।
Same pin leftovers: Blackboard img file read, grades feedback IDOR, hidden grade items।
मैंने MSA-26-0042/0043 के बाद moodle/moodle v5.2.3 pin किया। MSA-26-0005 ने auth_db को placeholder से बंद किया। मैंने enrol_database खोला क्योंकि यह उसी प्रकार के external DB से बात करता है और इसमें अभी भी db_addslashes है।
dbsybasequoting default 0 है, इसलिए केवल ' double होता है। idnumber में backslash-quote MySQL string को close कर देता है।
पहले से दर्ज गलत रास्ते: Moodle core $DB को sink मानना (यह नहीं है); इसे OS LPE कहना क्योंकि FILE एक MySQL privilege के रूप में मौजूद है (प्रदर्शित नहीं, यह leftover नहीं); student email को default map मानना (admin को localuserfield बदलना पड़ता है)। एक reverse shell। नाटक।
pin builders का faithful gadget, पूरा Moodle PHP app नहीं। php:8.3-cli copied db_get_sql / db_addslashes / db_encode serve करता है। mysql:8.0 में दो enrol rows हैं।
python3 moodle-enrol-database-sqli-Abraxas-Labs.py
या
cd lab
./run.sh
Target केवल http://127.0.0.1:19570। Compose project moodle-enrol-database-sqli। Run के बाद stack tear down हो जाता है।
SUCCESS moodle-enrol-database-sqli how=gadget plugin-off=no-query clean-rows=1 inject-rows=2 sql-concat=yes param-rows=0 extra=yes sink=enrol-db MOODLE-ENROL-DATABASE-SQLI-WITNESS
auth_db की parameterized queries copy करें (MDL-88138)। mapped course / user value को Execute($sql, [$value]) के रूप में pass करें। db_addslashes को '$value' में concatenate न करें। एक test जोड़ें कि course idnumber में quote होने पर अन्य courses से rows return न हों।
lib.php (db_get_sql, db_addslashes, sync_enrolments)auth_dbGNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई warranty नहीं।