
Joomla拡張機能 PhocaCommander は、getSource 関数においてパストラバーサル(Path Traversal)の脆弱性があります。
PhocaCommander ≤ 6.1.3 — 認証済み管理者によるパストラバーサル、CSRF 不要
PhocaCommander のファイルエディタエンドポイントには、任意ファイル読み取りの脆弱性が存在します。getSource() 関数は、base64 エンコードされた filename パラメータをデコードし、パス包含チェックなしで直接 file_get_contents() に渡します。認証済み管理者は、GET リクエストを送信するだけで、Web サーバプロセスがアクセス可能な任意のファイル(webroot 外のファイルを含む)を読み取ることができます。CSRF トークンは不要です。
この脆弱性を悪用すると、configuration.php から Joomla のデータベース認証情報と秘密鍵が漏えいし、パストラバーサルシーケンス(例: ../../../../etc/passwd)を使用して /etc/passwd などのシステムファイルを読み取ることができます。
| コンポーネント | 影響を受けるバージョン | テスト環境 | 修正済みバージョン |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
必要な認証: 管理者セッション(CSRF トークン不要 — GET リクエスト)
ファイル: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() は filename を base64 からデコードし、JPATH_ROOT に直接連結した後、包含チェックなしでファイルを読み取ります:
PHOCACOMMANDEREDIT.PHP — 脆弱なコード
public function getSource($fileName) {
$fileName = base64_decode($fileName); // ← attacker-controlled
$item = new stdClass;
if (PhocaCommanderHelper::fileExists(JPATH_ROOT . '/' . $fileName)) {
$item->source = file_get_contents(JPATH_ROOT . '/' . $fileName); // ← no containment check
}
return $item;
}
fileExists() は is_file(Path::clean($file)) を使用します。Path::clean() はスラッシュを正規化しますが、../ シーケンスは削除しないため、トラバーサルはチェックされずに webroot を脱出します。
コードベースには、helpers/phocacommander.php 内に realpath() ベースの適切な包含チェックを実行する getContainedRealPath() が存在します。これは save() と download() から呼び出されますが、getSource() には追加されていません。さらに、コントローラの edit() メソッドは GET 経由でディスパッチされるため、標準の CSRF トークンチェックは適用されません — アクティブな管理者セッション Cookie があれば、任意のファイル読み取りを誘発するのに十分です。
管理者ログインページから認証し、有効なセッション Cookie を取得します。標準の管理者セッション以外の権限は必要ありません。
base64 エンコードされたトラバーサルパスを含む、次の GET リクエストを送信します:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename のデコード結果: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
解決されたパス: /var/www/html/../../../../etc/passwd = /etc/passwd
エディタは /etc/passwd の全文を表示するため、webroot 外への読み取りアクセスが可能であることが確認できます。
リクエスト / レスポンス
