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 и первым полем идентификации.
Преподаватель без права редактирования в режиме Separate groups, без accessallgroups, отправляет POST с userid другого студента и читает отзыв этой группы.
| ID | 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. Курс в режиме Separate groups. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Нарушитель: преподаватель без права редактирования, зачисленный на курс с Separate groups, только в группе 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 в том же курсе | Тот же метод, угаданные id | Разведка | Предположено. В лаборатории использовался предустановленный id группы B |
| Перечисление группы B через родственный селектор | core_grades_get_gradable_users {courseid, groupid=B} | н/д | Доказано в лаборатории закрыто. cannotaccessgroup |
| Студент вызывает тот же сервис отзывов | роль студента, те же аргументы | н/д | Доказано в лаборатории закрыто. nopermissions |
| Отзыв в той же группе (студент группы A) | вызов преподавателем для Student Alpha | Разведка (предусмотрено) | Доказано в лаборатории разрешено. HTTP 200, error=false |
| PHP RCE / OS LPE / запись оценки | н/д | н/д | Закрыто. Этот остаток — чтение отзывов и полей профиля |
Стандартный Moodle без Separate groups или преподаватель, у которого уже есть 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. Seed создаёт курс с Separate groups, преподаватель только в группе 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. Без гарантий.