
免責事項: このリポジトリは教育目的および倫理的な開示のみのために作成されています。本脆弱性はベンダーに責任を持って報告され、修正済みです。適切な認可なしにシステムを悪用するために、この情報を使用しないでください。
EventPrime WordPress プラグイン(バージョン <= 4.2.8.1)に、未認証の任意ファイルアップロードの脆弱性が発見されました。この欠陥により、未認証の訪問者であれば誰でも WordPress の uploads ディレクトリに直接ファイルをアップロードし、メディアライブラリに添付ファイルのレコードを作成できます。
この脆弱性は、特定の AJAX エンドポイントが nopriv(公開アクセス可能)として明示的に登録されており、認可チェックと適切なファイルコンテンツ検証の両方が欠如しているために存在します。攻撃者はこのエンドポイントを悪用して、ストレージの枯渇、メディアライブラリへのスパム、または画像を装った悪意のあるペイロードのアップロードを引き起こす可能性があります。
<= 4.2.8.1根本原因は、安全でない AJAX フックの登録と、不十分なファイル検証の組み合わせです。
1. 安全でない AJAX エンドポイントの登録:
includes/class-eventprime-event-calendar-management.php 内で、プラグインは upload_file_media アクションを登録します。557行目付近で、アクションマップに {upload_file_media: true} を設定します。ここで true は _nopriv サポートを示します。その結果、gwp_ajax_nopriv_ep_upload_file_media` フックが登録され、エンドポイントが誰でも利用できるようになります。
2. 認可とノンスチェックの欠如:
ハンドラー関数 upload_file_media()(includes/class-ep-ajax.php の1659〜1697行)は、アップロード権限のチェックに current_user_can() を使用せず、セキュリティノンスの検証も行いません。
3. 欠陥のある検証ロジック:
ハンドラーは、クライアントが提供したファイル名に基づいてファイル拡張子(例: jpg/jpeg/png/gif)のみを検証します(1661〜1664行)。getimagesize() や wp_check_filetype_and_ext() のような堅牢なサーバーサイドのコンテンツ検証は実行されません。つまり、harmless.jpg にリネームされた悪意のあるスクリプトやその他のファイルタイプは、WordPress がメタデータ生成を試みる前にディスクに書き込まれることになります。
4. 永続化:
ファイルは move_uploaded_file() を使用して wp_upload_dir()['path'] に直接保存され、WordPress の添付ファイルは wp_insert_attachment() を介して作成されます。
ストレージ枯渇 (DoS): 攻撃者は大きなファイルを含むアップロードを自動化し、利用可能なサーバーディスク容量やクラウドストレージの割り当てをすべて消費して、ウェブサイトを停止させる可能性があります。
メディアライブラリへのスパム: 攻撃者は不適切または無価値な画像でメディアライブラリを埋め尽くし、管理者が使用できない状態にしてしまう可能性があります。
さらなる悪用の可能性: 他の脆弱性(ローカルファイルインクルージョン - LFI、またはサーバーが images を実行するように誤設定されている場合など)と組み合わせることで、リモートコード実行 (RCE) につながる可能性があります。
1. ペイロードを準備する: ローカルマシンに poc.jpg という名前のサンプル画像ファイルを作成します。
2. リクエストを実行する: セッションクッキーなしで、公開 AJAX エンドポイントに multipart/form-data の POST リクエストを送信します:
curl -i \
-F "[email protected];filename=poc.jpg" \
"http://TARGET_SITE/wp-admin/admin-ajax.php?action=ep_upload_file_media"
3. レスポンスを確認する: サーバーは 200 OK で応答し、新しく作成された添付ファイル ID を含む JSON オブジェクトを返します:
{"success":true,"data":{"attachment_id":117}}
4. 検証:
wp-content/uploads/<year>/<month>/poc.jpg に保存されています。この脆弱性を解決するには、開発者は以下のことを行う必要があります:
エンドポイントアクセスを制限する: アップロードが設計上、認証済みユーザーのみを対象としている場合は、nopriv 宣言を削除します。
権限チェックを実装する: current_user_can('upload_files') を使用して、承認された特権ユーザーのみがアップロードできるようにします。
ノンスを検証する: CSRF 攻撃を防ぐために check_ajax_referer() を実装します。
厳格なファイル検証: より厳格な MIME タイプとコンテンツチェックを実行する、従来の WordPress 画像処理関数(例: wp_handle_upload())を使用します。