
Mautic < 5.2.3 認証済みRCE
アップロードされたファイルの内容、タイプ、拡張子のサニタイゼーションが不十分なため、Asset Edition 機能では、認証された攻撃者が Web ディレクトリ内に任意の PHP コードを書き込み、そのファイルが書き込まれた場所を特定することができます。これにより、リモートコード実行(RCE: Remote Code Execution)が発生します。
また、パストラバーサルを利用して、Web ユーザーが変更権限を持つファイルシステム上の任意のディレクトリを再帰的に削除することも可能です。

/assets/view/{assetID} ルート経由で Asset を編集する際、その Asset のファイルを変更する機能が提供されます。
新しいファイルをアップロードすると、最終的に app/Bundles/AssetBundle/Controller/AssetController.php 内の以下の関数が呼び出されます。
public function editAction(Request $request, UploaderHelper $uploaderHelper, AssetModel $model, $objectId, $ignorePost = false)
アップロードのロジックは次の箇所にあります。
if (!$ignorePost && 'POST' == $method) {
$valid = false;
if (!$cancelled = $this->isFormCancelled($form)) {
if ($valid = $this->isFormValid($form)) {
$entity->setUploadDir($this->coreParametersHelper->get('upload_dir'));
$entity->preUpload();
$entity->upload();
特に注目すべきは と メソッドです。これらが実際のファイル書き込みをディスク上で処理します。 最初の欠陥は の にあります。この実装では任意のファイル拡張子を指定できるため(通常は allowed_extensions 配列によって提供される保護をバイパスします):
preUpload()upload()app/Bundles/AssetBundle/Entity/Asset.phppreUpload()
$filename = sha1(uniqid(mt_rand(), true));
$extension = $this->getFile()->guessExtension();
if (empty($extension)) {
// get it from the original name
$extension = pathinfo($this->originalFileName, PATHINFO_EXTENSION);
}
$this->path = $filename.'.'.$extension;
$extension = $this->getFile()->guessExtension(); の行は、.php で終わるファイル名と <?php タグで始まるコンテンツを提供すると NULL を返します。
したがって empty($extension) のチェックは true と評価され、ファイル拡張子は pathinfo() 呼び出しによって抽出されるため、任意のコンテンツと拡張子を持つ一時ファイルをアップロードできます。ファイル名は sha1() で生成されるため、実際の名前を制御することはできません。
その後、後続の upload() メソッド内で、ファイルは次の呼び出しにより Web ディレクトリ内のディスクに実際に書き込まれます。
$this->getFile()->move($this->getUploadDir(), $this->path);
これは私たちの任意の拡張子($this->path 変数に含まれる)を使用しています。 ファイル名は、Asset 詳細ページ(/assets/view/{assetId})を更新して「ローカルファイル名」テーブルエントリで確認できます。
注記: これは新しい Asset を作成するときに送信されるリクエストを変更することでも機能します。この場合、newAction() 関数が呼び出されますが、ロジックは同じであり、欠陥は依然として preUpload() および upload() メソッドにあります。
PoCはあと1か月ほど公開されません。
これは、このソフトウェアに依存する組織が、スクリプトキディによる破壊を恐れずにパッチを適用する時間を与えるためです。
その後、このリポジトリには完全なエクスプロイトスクリプトと証明が更新されます。とにかく、このページにはすでに十分な情報があります。
一時アップロードの検証時(/s/assets/new または /s/assets/edit/{assetId} 経由)、一時ファイルを保存するディレクトリはリクエストの最後に再帰的に削除されます。 一時ディレクトリの名前を保持するパラメータはパストラバーサル攻撃の影響を受けやすく、認証された攻撃者は、Web ユーザーにその権限があれば、システム上の任意のディレクトリを削除できます。 これによりデータの損失、あるいはサーバーが root ユーザーで実行されている場合はファイルシステム全体の破壊につながる可能性があります。
以下のエンドポイントを使用して、システム上に存在する任意のファイルを指定します。ファイルが存在する場合、サーバーはそれが保存されているディレクトリの削除を試みます。

サーバー乗っ取り サービス拒否(DoS) データ損失