
Moodle 5.2.3 - عالي - عن بُعد - SQLi - يقوم enrol_database بدمج course idnumber في SQL
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-enrol-database-sqli
Moodle LMS 5.2.3 - Moodle
الفئة: SQLi الوصول: عن بُعد
enrol_database::db_get_sql لا يزال يضيف الشرطات المائلة ويدمج النصوص. قام MSA-26-0005 / MDL-88138 بتحويل auth_db إلى استعلامات مُعاملة (parameterized) بصيغة Execute($sql, [$value]). لم تنسخ هذه الإضافة ذلك النمط. الإعدادات الافتراضية: dbsybasequoting=0، localcoursefield=idnumber. نقطة الوصول (sink) هي قاعدة بيانات التسجيل الخارجية. لا يمر $DB في نواة Moodle عبر هذا المسار.
معلّم محرّر على موقع مُفعّل فيه enrol_database يضبط idnumber للمقرر. يقوم Cron بإدراجه. تعود صفوف إضافية من قاعدة بيانات التسجيل.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-89 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| المنتج | Moodle |
| المتأثر | وسم 5.2.3 v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116). يجب تفعيل الإضافة enrol_database. |
| المصادقة | معلّم محرّر (idnumber للمقرر، الخريطة المحلية الافتراضية) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
معلّم محرّر على موقع مُفعّل فيه enrol_database يحقن SQL في قاعدة بيانات التسجيل الخارجية عبر ضبط idnumber للمقرر. ثم يقوم Cron sync_enrolments بتشغيل ذلك SQL.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| حقن جزء SQL في استعلام SELECT الخارجي للتسجيل | Cron sync_enrolments -> db_get_sql($table, array($coursefield=>$course->mapping), ...) -> $extdb->Execute($sql) | سلامة سلسلة الاستعلام | مُثبت مختبريًا. SQL المدمج هو WHERE courseid = 'LABCOURSE\'' OR 1=1 -- ' |
| قراءة صفوف تسجيل مقررات أخرى على تلك القاعدة الخارجية | نفس SELECT بعد إغلاق السلسلة | استطلاع | مُثبت مختبريًا. نظيف: صف واحد teacher-local. حقن: صفان بما في ذلك MOODLE-ENROL-DATABASE-SQLI-WITNESS |
| تخطي الاستعلام عند إيقاف الإضافة | نفس الأداة، plugin=off | لا ينطبق | مُثبت مختبريًا مغلق. executed=false، SQL فارغ، 0 صفوف |
| الاحتفاظ بنفس الحمولة كمعامل مرتبط (bound parameter) | بقايا auth_db من MSA-26-0005: Execute($sql, [$value]) | لا ينطبق | مُثبت مختبريًا مغلق. style=param أعاد 0 صفوف، SQL يحتوي على ? |
| تسجيل / إلغاء تسجيل / إسناد أدوار لمستخدمي Moodle المذكورين في الصفوف الإضافية | بعد أن يطبّق Cron requestedenrols | سلامة التسجيلات | مُستنتج. يتوقف المختبر عند الصفوف الإضافية على قاعدة بيانات التسجيل |
| FILE / INTO OUTFILE كمستخدم قاعدة بيانات التسجيل | نفس نقطة الوصول إذا كان ذلك الحساب يملك FILE | سلامة / توافر مضيف تلك القاعدة | مُستنتج. لم يُثبت. ليس تصعيدًا لصلاحيات نظام التشغيل |
| مسار يتحكم به الطالب | فقط إذا ربط المدير localuserfield=email (أو ما شابه) | لا ينطبق | مُستنتج. المسار الافتراضي هو idnumber الخاص بالمعلّم |
مغلق في هذه البقايا: $DB في نواة Moodle؛ الإضافة معطّلة (لا استعلام)؛ الوصول غير المُصادق؛ صدفة نظام التشغيل؛ الاستعلامات المكدّسة (أداة mysqli هذه أحادية العبارة). Moodle الافتراضي بدون enrol_database ليس هذه الثغرة.
بقايا نفس التثبيت: قراءة ملف Blackboard img، IDOR في ملاحظات الدرجات، عناصر الدرجات المخفية.
ثبّتت moodle/moodle v5.2.3 بعد MSA-26-0042/0043. أغلق MSA-26-0005 ثغرة auth_db باستخدام placeholder. فتحت enrol_database لأنه يتحدث إلى نفس نوع قاعدة البيانات الخارجية ولا يزال يحتوي على db_addslashes.
القيمة الافتراضية لـ dbsybasequoting هي 0، لذا تُضاعف ' فقط. الشرطة المائلة العكسية مع علامة الاقتباس في idnumber تُغلق سلسلة MySQL.
مسارات خاطئة مسجّلة مسبقًا: اعتبار $DB في نواة Moodle نقطة الوصول (وهو ليس كذلك)؛ تسمية هذا تصعيدًا لصلاحيات نظام التشغيل لأن FILE موجود كصلاحية MySQL (لم يُثبت، وليس هذه البقايا)؛ بريد الطالب كخريطة افتراضية (على المدير تغيير localuserfield). صدفة عكسية. مسرحية.
أداة مطابقة لمُثبّتي الإصدار، وليست تطبيق Moodle PHP كاملًا. php:8.3-cli يقدّم db_get_sql / db_addslashes / db_encode المنسوخة. mysql:8.0 يحتوي على صفّي تسجيل.
python3 moodle-enrol-database-sqli-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19570. مشروع Compose باسم moodle-enrol-database-sqli. تُفكّك الحزمة بعد التشغيل.
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 المُعاملة (MDL-88138). مرّر قيمة المقرر / المستخدم المربوطة كـ Execute($sql, [$value]). لا تدمج db_addslashes في '$value'. أضف اختبارًا يتحقق من أن علامة اقتباس في idnumber للمقرر لا تُعيد صفوفًا من مقررات أخرى.
lib.php (db_get_sql، db_addslashes، sync_enrolments)auth_dbGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.