WordPressプラグイン
コンポーネント名 WP Ultimate Exporter
脆弱性のあるバージョン <= 2.9.1
コンポーネントスラッグ wp-ultimate-exporter
コンポーネントリンク https://wordpress.org/plugins/wp-ultimate-exporter/
脆弱性クラス A4: 安全でない設計
脆弱性タイプ リモートコード実行(RCE)
管理者
WP Ultimate Exporterプラグインは、WP Ultimate CSV Importerプラグインのアドオンです。このプラグインを使用すると、すべての投稿、製品、注文、返金、ユーザーデータをCSV、XLS、XML、JSON形式でエクスポートできます。エクスポート時には、ファイルがアップロードパスに作成され、プラグインはそれらのファイルの内容をユーザーに配信するだけです。
WP Ultimate Exporterプラグインのバージョン2.9.1以前では、データのエクスポートを要求する際に、リクエストデータ内のファイル拡張子がPHPに設定されている場合、アップロードパスにPHPファイルが作成されます。そのため、作成されたファイルの内容にPHP構文が含まれている場合、そのファイルにアクセスするとPHP構文が実行されるため、リモートコード実行(RCE)の脆弱性が発生します。
⚠️ 「WP Ultimate Exporter」プラグインは「WP Ultimate CSV Importer」プラグインのアドオンであるため、両方のプラグインをインストールする必要があります。
コードエディタ(ショートカットキー: ⇧ ⌥ ⌘ M)を使用して、以下の内容で新しい投稿を作成します:
<pre>
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
</pre>
WP Ultimate Exporterプラグインの「エクスポート」タブに移動します。これは、WP Ultimate CSV Importerプラグインのダッシュボード(/wp-admin/admin.php?page=com.smackcoders.csvimporternew.menu)の「エクスポート」タブをクリックしてアクセスできます。
プロキシツール(例: BurpSuite)を起動してリクエストパケットをインターセプトし、インターセプトを有効にした状態で次の手順を進めます。
次に、「データをエクスポートするモジュールを選択」から「投稿」を選択し、次のステップに進みます。

エクスポートファイル名 「webshell」と入力詳細設定 「CSV」を選択
/wp-admin/admin-ajax.php URLにPOSTメソッドのリクエストが送信されます。リクエストデータ内のexp_typeの値をcsvからphpに変更し、[転送]をクリックします。
/wp-content/uploads/smack_uci_uploads/exports/webshell.php?cmd=cat /etc/passwdと入力すると、WordPressがインストールされているサーバー上の/etc/passwdファイルの内容が表示されます。これにより、RCEの脆弱性が実証されます。
WP Ultimate Exporterプラグインでデータをエクスポートする際、/wp-content/plugins/wp-ultimate-exporter/exportExtensions/ExportExtension.phpファイル内のparseData関数が呼び出されます。
この時点で、エクスポートデータ形式を決定するリクエストデータexp_typeに対してフィルタリングは実行されず、その値がメンバー変数$this->exportTypeに直接挿入されます。

続いて、proceedExport関数が呼び出され、データがファイルに保存されます。この時点で、ファイルの保存パスを指定する変数$fileを初期化する際にも、メンバー変数$this->exportTypeがフィルタリングなしで使用されます。

続いて、変数$fileに格納されたファイルパスがfile_put_contents関数の引数として渡され、この時点で、リクエストデータexp_typeで指定された拡張子が直接適用された状態でファイルが保存されます。

したがって、Webシェルコードを含む投稿データがPHPファイルとして保存され、そのファイルにアクセスされると、PHPコードが実行されるため、リモートコード実行(RCE)の脆弱性が発生します。


次に、以下のコマンドを入力してPoCコードを実行します。
必要なモジュールrequests
python poc.py
