Moodle 5.2.3 - 高 - リモート - IDOR - core_grades_get_feedback が separate-groups チェックをスキップする
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} | n/a | ラボ実証済みでクローズ。cannotaccessgroup |
| 学生が同じフィードバックサービスを呼び出す | student ロール、同じ引数 | n/a | ラボ実証済みでクローズ。nopermissions |
| 同一グループのフィードバック(Group A の学生) | Student Alpha に対する教師の呼び出し | 偵察(意図された動作) | ラボ実証済みで許可。HTTP 200、error=false |
| PHP RCE / OS LPE / 成績の書き込み | n/a | n/a | クローズ。この残存問題はフィードバックとプロファイルフィールドの読み取りである |
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 のみです。プロジェクト 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 を参照してください。ループバックラボ専用。保証はありません。