Moodle 5.2.3 - 높음 - 원격 - IDOR - core_grades_get_feedback가 분리 그룹 검사를 건너뜀
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-feedback-idor
분석 문서: https://abraxaslabs.tech/research/moodle-grades-feedback-idor
Moodle LMS 5.2.3 - Moodle
분류: IDOR 도달 범위: 원격
core_grades_get_feedback는 여전히 require_capability('gradereport/grader:view')만 호출합니다. 다른 성적 웹 서비스들은 MSA-26-0016 / MDL-88667 이후 groups_user_groups_visible / groups_group_visible 검사를 추가로 갖추게 되었지만, 이 AJAX 서비스에는 추가되지 않았습니다. JSON 응답에는 feedbacktext, fullname, picture, 그리고 첫 번째 신원 필드가 포함되어 반환됩니다.
Separate groups 과정에서 accessallgroups 권한이 없는 비편집 교사가 다른 학생의 userid를 POST하여 해당 그룹의 피드백을 읽을 수 있습니다.
| ID | 아직 CVE 없음 |
| CWE | CWE-863 / CWE-200 |
| CVSS | Medium: 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 과정에 등록되어 Group A에만 속하고, grader view 권한은 있으나 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 | 정찰 | 추론. 실습에서는 시드된 Group B id 사용 |
| 형제 선택기를 통해 Group B 목록 조회 | core_grades_get_gradable_users {courseid, groupid=B} | 해당 없음 | 실습 입증 차단됨. cannotaccessgroup |
| 학생이 동일한 피드백 서비스 호출 | student 역할, 동일 인자 | 해당 없음 | 실습 입증 차단됨. nopermissions |
| 동일 그룹 피드백(Group A 학생) | Student Alpha에 대한 교사 호출 | 정찰(의도된 동작) | 실습 입증 허용됨. HTTP 200, error=false |
| PHP RCE / OS LPE / 성적 쓰기 | 해당 없음 | 해당 없음 | 차단됨. 이 잔여 취약점은 피드백과 프로필 필드의 읽기입니다 |
Separate groups가 없는 기본 Moodle, 또는 이미 moodle/site:accessallgroups 권한을 가진 교사는 이 잔여 취약점에 해당하지 않습니다. 해당 권한을 가진 편집 교사는 이미 모든 그룹을 볼 수 있습니다.
동일 버전의 다른 잔여 취약점: Blackboard img 파일 읽기, enrol_database SQLi, 숨겨진 성적 항목.
moodle/moodle v5.2.3을 MSA-26-0042/0043 이후로 고정했습니다. MSA-26-0016은 다른 성적 웹 서비스들의 그룹 검사를 막았습니다. get_feedback.php는 그 대상에 포함되지 않았습니다. 채점자 UI는 강화되었습니다. 이 AJAX 서비스는 그렇지 않았습니다.
이미 기록된 잘못된 판단들: 형제 서비스인 get_gradable_users의 누락을 전부인 양 다룬 것(그것은 이미 cannotaccessgroup을 발생시킵니다); 페이로드에 itemid가 있다고 해서 이를 점수 쓰기라고 부른 것(이 서비스는 읽기입니다); 학생을 공격자로 본 것(nopermissions). 리버스 셸. 쇼에 불과합니다.
php:8.3-cli + MariaDB 11.4에서 실행되는 라이브 Moodle v5.2.3. 시드는 Separate-groups 코스를 만들고, 교사는 Group A에만, 학생 B는 Group B에만 속하며, moodle/site:accessallgroups에 CAP_PREVENT가 설정되고, 피드백이 증거가 되는 수동 성적 항목을 포함합니다. 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)가 참이고 대상이 등록되어 있지 않으면 거부합니다. MDL-88667 이후의 gradereport_user 및 core_grades_get_gradable_users와 동일한 형태입니다.
get_feedback.phpget_gradable_users.phpGNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 랩 전용입니다. 보증은 제공되지 않습니다.