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
الفئة: IDOR الوصول: عن بُعد
core_grades_get_feedback لا يزال يستدعي فقط require_capability('gradereport/grader:view'). اكتسبت خدمات الويب الأخرى للدرجات groups_user_groups_visible / groups_group_visible بعد MSA-26-0016 / MDL-88667. أما خدمة AJAX هذه فلم تفعل. يعود JSON محتويًا على feedbacktext وfullname وpicture وأول حقل هوية.
معلّم غير مُحرِّر في مجموعات منفصلة، بدون accessallgroups، يرسل userid طالب آخر ويقرأ ملاحظات تلك المجموعة.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-863 / 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) |
| المصادقة | معلّم غير مُحرِّر لديه gradereport/grader:view، بدون moodle/site:accessallgroups. المقرر في مجموعات منفصلة. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
الكاتب: معلّم غير مُحرِّر مسجَّل في مقرر بمجموعات منفصلة، في المجموعة A فقط، لديه صلاحية عرض الدرجات وبدون access-all-groups. يختار userid لطالب آخر مسجَّل (أعداد صحيحة متتالية) ويستدعي خدمة AJAX. ليس RCE. ليس LPE. ليس كتابة درجة.
| الصلاحية | الطريقة / الهدف | الاستطلاع / السلامة / التوافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| قراءة ملاحظات درجات مجموعة أخرى | POST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid} | استطلاع | مُثبت مختبريًا. HTTP 200، error=false، feedbacktext يحتوي على MOODLE-GRADES-FEEDBACK-IDOR-WITNESS |
| قراءة حقل هوية ذلك الطالب واسم العرض | نفس الاستجابة additionalfield / fullname / picture | استطلاع | مُثبت مختبريًا. [email protected]، fullname=Student Bravo |
تجربة قيم userid المتتالية في نفس المقرر | نفس الطريقة، معرّفات مُخمَّنة | استطلاع | مُستنتج. استخدم المختبر معرّف المجموعة B المُهيَّأ |
| سرد المجموعة B عبر المُحدِّد الشقيق | core_grades_get_gradable_users {courseid, groupid=B} | لا ينطبق | مُثبت مختبريًا مغلق. cannotaccessgroup |
| الطالب يستدعي نفس خدمة الملاحظات | دور الطالب، نفس الوسائط | لا ينطبق | مُثبت مختبريًا مغلق. nopermissions |
| ملاحظات نفس المجموعة (طالب في المجموعة A) | استدعاء المعلّم للطالب Alpha | استطلاع (مقصود) | مُثبت مختبريًا مسموح. HTTP 200، error=false |
| PHP RCE / OS LPE / كتابة درجة | لا ينطبق | لا ينطبق | مغلق. هذه البقايا هي قراءة للملاحظات وحقول الملف الشخصي |
Moodle الافتراضي بدون مجموعات منفصلة، أو معلّم لديه بالفعل moodle/site:accessallgroups، ليس هذه البقايا. المعلّمون المُحرِّرون الذين لديهم هذه الصلاحية يرون كل المجموعات بالفعل.
بقايا نفس الإصدار: Blackboard img file read، enrol_database SQLi، hidden grade items.
ثبّتُّ moodle/moodle v5.2.3 بعد MSA-26-0042/0043. أغلق MSA-26-0016 فحوصات المجموعات في خدمات ويب أخرى للدرجات. لم يكن get_feedback.php ضمن تلك المجموعة. تم تحصين واجهة المُصحِّح. أما خدمة AJAX هذه فلم تُحصَّن.
المنعطفات الخاطئة المسجَّلة بالفعل: اعتبار إخفاق get_gradable_users الشقيق القصة كاملة (ذلك بالفعل يرمي cannotaccessgroup)؛ تسمية هذا كتابة درجة لأن الحمولة تسمّي itemid (الخدمة قراءة)؛ الطالب كمهاجم (nopermissions). صدفة عكسية. مسرح.
Moodle مباشر v5.2.3 على php:8.3-cli + MariaDB 11.4. التهيئة تبني مقررًا بمجموعات منفصلة، معلّم في المجموعة A فقط، طالب B في المجموعة B فقط، CAP_PREVENT على moodle/site:accessallgroups، وعنصر درجة يدوي ملاحظاته هي الشاهد. how=live.
Compose يربط ../../vendors/moodle/src كـ /opt/moodle-pin (المسار نسبي إلى lab/docker-compose.yml). استنسخ moodle/moodle وسم v5.2.3 إلى ذلك المسار، أو وجّه الحجم إلى نسختك المستنسخة. شجرة Moodle ليست في هذه الحزمة.
python3 moodle-grades-feedback-idor-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19580. مشروع Compose moodle-grades-feedback-idor. تُفكَّك الحزمة بعد التشغيل.
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، حمّل المقرر والمستخدم الهدف، ثم ارفض ما لم يكن groups_user_groups_visible($course, $userid) والمستخدم الهدف مسجَّلًا. نفس الشكل الذي في gradereport_user وcore_grades_get_gradable_users بعد MDL-88667.
get_feedback.phpget_gradable_users.phpGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.