
Joomla拡張機能PhocaCommanderは、削除、コピー、移動アクションでパストラバーサルに対して脆弱 - CVSS 6.4
PhocaCommander ≤ 6.1.3 — 認証済み管理者がWebルート外のファイルを操作できる
PhocaCommander のファイルアクションハンドラは、攻撃者が制御するbase64エンコードされたパラメータ(pathfrom、pathwhere)からソースパスとデスティネーションパスを構築しますが、パス封じ込めの検証を一切行いません。認証済み管理者は、Webサーバープロセスがアクセス可能なファイルシステム上の任意の場所で、ファイルの削除、コピー、移動ができます。
ラボで確認済み: /tmp/(Webルート外)にあるファイルの削除と、/etc/passwd の PhocaCommander ファイルマネージャへのコピー — 組み込みエディタでその内容を読めるようにすること。3つの操作(削除、コピー、移動)はすべて、同じ未検証のコードパスを共有しています。
| コンポーネント | 影響を受けるバージョン | テスト済み環境 | 修正バージョン |
|---|---|---|---|
| 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/views/phocacommanderactiona/view.json.php
アクションビューは pathfrom と pathwhere をbase64からデコードし、封じ込めチェックを行うことなく JPATH_ROOT に直接連結します。これらの未検証のパスは、3つのファイル操作すべてで使用されます。
VIEW.JSON.PHP — 脆弱なパス構築
// Both parameters decoded from base64 — no containment check
$pathFrom = JPATH_ROOT . '/' . base64_decode($this->t['pathfrom']) . '/';
$pathWhere = JPATH_ROOT . '/' . base64_decode($this->t['pathwhere']) . '/';
// Delete — removes any file reachable by www-data
$srcValue = $pathFrom . $v;
if (PhocaCommanderHelper::fileExists($srcValue)) {
File::delete($srcValue);
}
// Copy / Move — arbitrary cross-directory file operations
File::copy($pathFrom . $v, $pathWhere . $v);
File::move($pathFrom . $v, $pathWhere . $v);
PhocaCommanderHelper::fileExists() は is_file(Path::clean($file)) を使用します。Path::clean() はスラッシュを正規化しますが、../ シーケンスは削除しません。そのため、どちらかのパラメータ内のトラバーサルシーケンスは、チェックされることなく任意のファイルシステムパスに解決されます。
テストファイルは www-data が所有する /tmp/poc.txt に作成され、削除操作の前にターゲットが存在することを確認します。

管理者ログインページから認証します。Joomlaフォームトークンを取得します。これは任意の管理ページの隠し入力フィールドとして表示されます。

デコードされたパラメータ:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → ファイル名 poc.txtリクエスト / レスポンス


シナリオ1の管理者セッションを再利用するか、再度認証して新しいCSRFトークンを取得します。
デコードされたパラメータ:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → ファイル名 passwdリクエスト / レスポンス

/etc/passwd は、www-data が所有する phoca-files/passwd としてWebルート内に存在するようになりました。

管理パネルのPhocaCommanderファイルマネージャに移動し、phoca-files/ を開いて、ファイル passwd をクリックし、編集をクリックすると、組み込みのCodeMirrorエディタで内容を表示できます。/etc/passwd の全内容が表示されます。

www-data が書き込み可能なファイルを永久に削除できる。他のサービスのアプリケーション設定、ロックファイル、cronジョブなども含む/etc/shadow、秘密鍵、他のアプリの .env ファイルなど)をWebルート内にコピーすると、追加の操作なしでHTTP経由でアクセスできるようになる