
Joomla拡張機能PhocaCommanderは、ファイルアップロードアクションでパストラバーサルに対して脆弱 - CVSS 6.1
PhocaCommander ≤ 6.1.3 — 認証済み管理者がWebルート外にファイルを書き込む
PhocaCommanderのファイルアップロードハンドラーは、攻撃者が制御するbase64エンコードされたfolderパラメータから宛先パスを構築しますが、パス封じ込め(パストラバーサル)の検証は一切行われません。認証済み管理者は、Webサーバープロセスが書き込み可能なWebルート外の任意の場所にファイルをアップロードできます。
ラボで確認済み:folder=Li4vLi4vLi4vdG1w(= ../../../tmp)でアップロードすると、アップロードしたファイルは www-data が所有する /tmp/(/var/www/html/ の外)に配置されます。本番のPHP-FPM環境では、これを連鎖させてリモートコード実行を達成できます。
| コンポーネント | 脆弱性あり | テスト環境 | 修正版 |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
**必要な認証:**管理者(セッション + CSRFトークン)
ファイル: administrator/components/com_phocacommander/helpers/fileupload.php — realMultipleUpload()
realMultipleUpload() は、folder POSTパラメータをbase64からデコードし、それをそのまま Path::clean() の連結に渡します。連結されたパスは、封じ込めチェックなしにアップロード先として使用されます。
FILEUPLOAD.PHP — 脆弱なコード
$folder = $app->getInput()->get('folder', '', '', 'string');
$folder = base64_decode($folder); // ← attacker-controlled
$path = JPATH_ROOT; // = /var/www/html
if (isset($folder) && $folder != '') {
$pathFolder = Path::clean($path . '/' . $folder . '/');
// e.g. Path::clean('/var/www/html/../../../tmp/')
// = '/tmp/' — outside the webroot, no error thrown
}
// ...
File::upload($file['tmp_name'], $pathFolder . strtolower($file['name']));
Path::clean() はディレクトリ区切り文字を正規化しますが、../ シーケンスを解決したり除去したりしません。解決されたパスは、その後の境界チェックなしに File::upload() に直接渡されます。
アップロード拡張子の許可リスト
このハンドラーは拡張子の許可リスト(画像、ドキュメント、アーカイブ、テキストファイル)を適用し、.php や .htaccess などのサーバー実行可能なタイプをブロックします。ただし、許可リストで許可されるファイルタイプの多く(シェルスクリプト、cronジョブ定義、設定ファイルの断片など)は、OSの機密パスに書き込まれると重大な被害を引き起こす可能性があります。
管理者ログインページから認証します。JoomlaのCSRFトークンは、任意の管理ページから取得できます。隠しフォームフィールドとして表示されるか、ページソースから抽出できます。

次のURLに対してmultipart POSTリクエストを送信します:POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload。fileフィールドにファイルの内容を、folderフィールドにbase64エンコードされたトラバーサルパス Li4vLi4vLi4vdG1w (= ../../../tmp) を指定します。サーバーはHTTP 200と {"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"} で応答します。
リクエスト / レスポンス

ファイルが /tmp/upload_test.txt に書き込まれたことを確認します。場所は /var/www/html/ の外で、所有者は www-data です。

www-data が書き込み可能な任意のパス(OSスケジューラ、SSHデーモン、その他のサービスが使用するパスを含む)に、攻撃者が選択した内容を書き込むことができます。.txtファイルを.user.ini(auto_prepend_file)と組み合わせてWebアクセス可能なディレクトリにアップロードすると、そのディレクトリへの次のリクエストでPHPが実行されます。