
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
الفئة: IDOR الوصول: عن بُعد
core_grades_get_gradeitems هو ajax بالإضافة إلى خدمة الجوال الرسمية، بدون مفتاح capabilities في services.php. validate_context هو البوابة الوحيدة. ثم يقوم grade_item::fetch_all بإخراج كل عنصر في المقرر. يقوم array_filter بإسقاط GRADE_TYPE_NONE وعناصر الفئات وعنصر المقرر. المخفي ليس ضمن هذا الفلتر. الشقيق core_grades_get_grade_tree يتطلب بالفعل moodle/grade:viewall.
طالب مسجّل يرسل POST بـ {courseid} ويحصل على أسماء عناصر الدرجات المخفية التي لا يزال واجهة سجل درجات الطالب يخفيها.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-862 / 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) |
| المصادقة | طالب مسجّل (moodle/grade:view؛ يفتقر إلى viewall / viewhidden) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
الكاتب: طالب مسجّل في المقرر. يرسل POST إلى خدمة AJAX بـ {courseid}. الاستجابة هي أسماء ومعرّفات وفئات. مخطط الإرجاع لا يحتوي على درجات. ليس RCE. ليس LPE. ليس كتابة درجة.
| الصلاحية | الطريقة / نقطة الوصول | استطلاع / سلامة / إتاحة | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| قراءة اسم ومعرّف وفئة عنصر درجة مخفي | POST /lib/ajax/service.php?sesskey= core_grades_get_gradeitems {courseid} | استطلاع | مُثبت مختبريًا. HTTP 200، الأسماء تتضمن MOODLE-GRADES-GRADEITEMS-WITNESS |
| قراءة اسم ومعرّف وفئة عنصر درجة مرئي | نفس الاستجابة | استطلاع (مقصود للمعلمين) | مُثبت مختبريًا. الأسماء تتضمن Visible Lab Assignment |
| نفس الكتالوج عبر خدمة الجوال الرسمية | نفس الفئة، services تتضمن MOODLE_OFFICIAL_MOBILE_SERVICE | استطلاع | مُستنتج من services.php. المختبر استخدم AJAX. |
التنقل عبر قيم courseid المتسلسلة للمقررات التي يمكن للطالب دخولها | نفس الطريقة، معرّفات مُخمّنة | استطلاع | مُستنتج. المختبر استخدم معرّف المقرر المُهيّأ 2 |
| رؤية العنصر المخفي في واجهة سجل درجات الطالب | GET /grade/report/user/index.php?id= | لا ينطبق | مُثبت مختبريًا مغلق. hidden-in-ui=False، visible-in-ui=True |
| الاستدعاء بدون جلسة | AJAX بمفتاح sesskey وهمي | لا ينطبق | مُثبت مختبريًا مغلق. servicerequireslogin |
| الاستدعاء كمستخدم مسجّل الدخول غير مسجّل في المقرر | AJAX من خارجي، نفس courseid | لا ينطبق | مُثبت مختبريًا مغلق. requireloginerror |
| قراءة درجات طلاب آخرين أو كتابة الدرجات | لا ينطبق | لا ينطبق | مغلق. مفاتيح الإرجاع هي id، itemname، category |
| PHP RCE / OS LPE | لا ينطبق | لا ينطبق | مغلق. هذه البقايا هي قراءة كتالوج |
المعلم أو المدير الذي يمتلك بالفعل moodle/grade:viewall يرى الكتالوج بالفعل. الضيف / المستدعون غير المصادق عليهم لا يزالون بحاجة إلى سياق مقرر.
بقايا نفس الإصدار: Blackboard img file read، enrol_database SQLi، grades feedback IDOR.
ثبّتُ moodle/moodle v5.2.3 بعد MSA-26-0042/0043. كانت خدمات ويب الدرجات ضمن نافذة MSA تلك. get_gradeitems.php لا يزال بدون require_capability. واجهة الطالب كانت تخفي العنصر بالفعل. كتالوج AJAX لم يفعل.
المنعطفات الخاطئة المسجّلة بالفعل: اعتبار AJAX غير المصادق عليه 200 كتسريب (المحتوى هو servicerequireslogin)؛ تسمية هذا IDOR للدرجات لأن اسم الطريقة يحتوي على grade (المخطط أسماء فقط)؛ توقع أن يكون get_grade_tree نفس البقايا (فهو يتطلب بالفعل viewall). reverse shell. مسرحية.
Moodle مباشر v5.2.3 على php:8.3-apache + MariaDB 11.4. التهيئة تسجّل labstudent، وتُبقي laboutsider خارج المقرر، وتنشئ عنصرًا يدويًا مرئيًا بالإضافة إلى عنصر مخفي اسمه هو الشاهد. run.sh ينسخ إصدارًا محليًا أو 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: require_capability('moodle/grade:viewall', $context). كذلك أسقط العناصر المخفية ما لم يكن للمستدعي moodle/grade:viewhidden. أضف حالة Behat/PHPUnit: طالب مسجّل، عنصر يدوي مخفي، يجب أن يُسقط core_grades_get_gradeitems ذلك العنصر (أو 403). واجهة سجل درجات الطالب تخفيه بالفعل.
get_gradeitems.phpget_grade_tree.phpservices.php (core_grades_get_gradeitems، بدون capabilities)GNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. بدون ضمان.