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
Class: IDOR Reach: Remote
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 |
| Product | Moodle |
| Affected | 5.2.3 태그 v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Auth | gradereport/grader:view 권한을 가진 비편집 교사, moodle/site:accessallgroups 권한은 없음. Separate groups 과정. |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 전용 |
작성자: Separate-groups 과정에 등록된 비편집 교사로, Group A에만 속하고, grader view 권한이 있으며 access-all-groups 권한은 없습니다. 다른 등록 학생의 userid(순차 정수)를 선택하여 AJAX 서비스를 호출합니다. RCE가 아닙니다. LPE도 아닙니다. 점수 쓰기도 아닙니다.
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven or inferred |
|---|---|---|---|
| 다른 그룹의 성적 피드백 읽기 | POST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid} | Recon | Lab-proven. HTTP 200, error=false, feedbacktext에 MOODLE-GRADES-FEEDBACK-IDOR-WITNESS 포함 |
| 해당 학생의 신원 필드와 표시 이름 읽기 | 동일 응답 additionalfield / fullname / picture | Recon | Lab-proven. [email protected], fullname=Student Bravo |
동일 과정에서 순차 userid 값 탐색 | 동일 메서드, 추측한 id | Recon | Inferred. Lab에서는 시드된 Group B id 사용 |
| 형제 선택자를 통해 Group B 나열 | core_grades_get_gradable_users {courseid, groupid=B} | n/a | Lab-proven closed. cannotaccessgroup |
| 학생이 동일 피드백 서비스 호출 | student 역할, 동일 인자 | n/a | Lab-proven closed. nopermissions |
| 동일 그룹 피드백 (Group A 학생) | Student Alpha에 대한 교사 호출 | Recon (의도된 동작) | Lab-proven allowed. HTTP 200, error=false |
| PHP RCE / OS LPE / 성적 쓰기 | n/a | n/a | Closed. 이 잔여 취약점은 피드백과 프로필 필드의 읽기입니다 |
Separate groups가 없는 기본 Moodle, 또는 이미 moodle/site:accessallgroups 권한을 가진 교사는 이 잔여 취약점에 해당하지 않습니다. 해당 권한을 가진 편집 교사는 이미 모든 그룹을 볼 수 있습니다.
동일 핀의 잔여 취약점: Blackboard img 파일 읽기, enrol_database SQLi, 숨겨진 성적 항목.
MSA-26-0042/0043 이후 moodle/moodle v5.2.3을 고정했습니다. MSA-26-0016은 다른 성적 웹 서비스들의 그룹 검사를 닫았습니다. get_feedback.php는 그 대상에 포함되지 않았습니다. grader UI는 강화되었습니다. 이 AJAX 서비스는 그렇지 않았습니다.
이미 기록된 잘못된 방향: 형제 서비스 get_gradable_users의 누락을 전체 이야기로 취급한 것(그것은 이미 cannotaccessgroup을 던짐); 페이로드에 itemid가 있다고 해서 점수 쓰기라고 부른 것(이 서비스는 읽기임); 학생을 공격자로 가정한 것(nopermissions). 리버스 셸. 연극.
php:8.3-cli + MariaDB 11.4에서 실행되는 라이브 Moodle v5.2.3. 시드는 Separate-groups 과정, Group A에만 속한 교사, Group B에만 속한 학생 B, moodle/site:accessallgroups에 대한 CAP_PREVENT, 그리고 피드백이 witness인 수동 성적 항목을 구성합니다. 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 참조. 루프백 Lab 전용. 보증 없음.