Moodle 5.2.3 - 高 - リモート - IDOR - core_grades_get_feedback が separate-groups チェックをスキップする
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') を呼び出すだけである。他の成績 Web サービスは 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 のみ |
Writer: 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 file read、enrol_database SQLi、hidden grade items。
MSA-26-0042/0043 の後、moodle/moodle v5.2.3 をピン留めした。MSA-26-0016 は他の成績 Web サービスにおけるグループチェックを塞いだ。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 のみ。無保証。