
Moodle 5.2.3 - 高 - リモート - パス - Blackboard img src がインポートツリー外のファイルをコピーする
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-blackboard-img
Moodle LMS 5.2.3 - Moodle
クラス: ファイル読み取り 到達範囲: リモート
qformat_blackboard_six_base::text_field は img src を PARAM_PATH なしで $this->filebase に結合します。その後 store_file_for_text_field がそのパスをユーザーのドラフトファイルエリアにコピーします。同系統の get_filecontent はすでに clean_param($path, PARAM_PATH) でジェイルしています。MSA-26-0012 はデータベースアクティビティのインポートを PARAM_FILE でジェイルしました。Blackboard の img src はその対象に含まれていませんでした。
Blackboard zip をインポートできる教師が <img src="https://raw.githubusercontent.com/html/config.php"> を仕込みます。ドラフトの「画像」は config.php です。学生はインポートできません。
| ID | CVE 未割当 |
| CWE | CWE-22 / CWE-73 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 製品 | Moodle |
| 影響バージョン | 5.2.3 タグ v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| 認証 | 教師 (問題バンク / レッスンの Blackboard インポート) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
書き込み者: Blackboard zip を問題バンク (またはレッスン) にインポートできる教師。典型的な狙いは PHP ユーザーとしての config.php (DB パスワード) です。2 つ目の残存脆弱性を連鎖させない限り RCE ではありません。LPE でもありません。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|
img src の ../ を介して PHP ユーザーが開けるファイルを読み取る | text_field が $this->filebase . '/' . $path を結合; store_file_for_text_field がドラフトエリアにコピー | 偵察 (ファイルバイト) | ラボ実証済み。ドラフトのバイトが /var/www/html/config.php と一致し、MOODLE-BLACKBOARD-IMG-WITNESS を含む |
| そのドラフトを「画像」としてダウンロード | ドラフト itemid + 書き換えられた @@PLUGINFILE@@ ファイル名 | 偵察 | ラボ実証済み。GET /draft が 298 バイトを返し、sha256 が config.php と一致 |
| 後でインポートされた問題を開ける者 | 同じドラフト / pluginfile | 偵察 | 推測。ラボは教師ドラフトの一致で停止 |
| 学生のインポート | 同じ zip、role=student | n/a | ラボ実証済み クローズ。HTTP 403 teacher-only |
clean_param($path, PARAM_PATH) を通る同じパス | ガジェット jail=1 | n/a | ラボ実証済み クローズ。一致なし、witness なし、パスは filebase 配下に留まる |
| PHP RCE / OS LPE | n/a | n/a | クローズ。この残存脆弱性はファイルバイトをドラフトにコピーするだけ。実行はしない |
Blackboard インポートのないデフォルトの Moodle はこのバグの対象ではありません。MSA-22-0016 は baseurl のみをクリーンアップしました。
同じピンの残存脆弱性: enrol_database SQLi、grades feedback IDOR、hidden grade items。
MSA-26-0042/0043 の後、moodle/moodle v5.2.3 をピン留めしました。MSA-26-0012 はデータベースアクティビティのインポートをジェイルしました。次に Blackboard を調査したのは、get_filecontent() がすでに PARAM_PATH を認識していたのに text_field() が依然として生の結合を行っていたためです。
すでに記録済みの誤った道: 学生のインポートをリークとみなすこと (実際は 403)。コピーされたファイルが PHP だからといってこれを RCE と呼ぶこと (ドラフトはバイトを保存するだけで include はしない)。MSA-22-0016 が作業を完了したと仮定すること (baseurl のみ)。リバースシェル。茶番。
ピンの text_field / store_file_for_text_field を忠実に再現したガジェットであり、完全な Moodle PHP アプリではありません。how=gadget。
python3 moodle-blackboard-img-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:19560 のみ。Compose プロジェクト moodle-blackboard-img。実行後にスタックは破棄されます。
SUCCESS moodle-blackboard-img how=gadget pin=v5.2.3 teacher-import=yes draft-match-config=yes student=403 param-path-jail=yes MOODLE-BLACKBOARD-IMG-WITNESS
img src に clean_param($path, PARAM_PATH) を適用し、その後 realpath が realpath($this->filebase) 配下に留まることを確認します。get_filecontent() と同じ形です。
formatbase.php (text_field、store_file_for_text_field)format.php (get_filecontent はすでに PARAM_PATH を使用)GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。