
CVE 再現: cve-2026-63030_60137-wordpress_rce_reproduction
発見者: Searchlight Cyber (GPT-5.6 Sol 経由)
深刻度: 緊急 — CVSS 9.8 (CVE-2026-63030)、CVSS 9.1 (CVE-2026-60137)
ステータス: 活発に悪用中 — CISA KEV に追加済み
別名: "wp2shell"
これは WordPress コアにおける、2 件の CVE から構成される未認証のリモートコード実行チェーンです:
| CVE | コンポーネント | 種別 | CWE |
|---|---|---|---|
| CVE-2026-63030 | WP REST API バッチエンドポイント | ルート混乱 / アクセス制御バイパス | CWE-436 |
| CVE-2026-60137 | WP_Query の author__not_in パラメータ | SQL インジェクション | CWE-89 |
個々の欠陥はそれぞれ深刻ですが、組み合わせることで、未認証の攻撃者が標的上で任意の PHP を実行し、ウェブシェルを展開できるようになります。
WordPress REST API は /wp-json/wp/v2/batch にバッチエンドポイントを公開しています。ルート解決の欠陥 (WP 6.9 で書き直されたルーティングミドルウェアで導入) により、バッチプロセッサーは、バッチ内の 内部 サブリクエストが外側のリクエストの認証および権限チェックを継承することを正しく検証しません。攻撃者は、以下のようなバッチペイロードを作成できます:
wp/v2/users、wp/v2/plugins) を呼び出す。WP_REST_Server::dispatch() を利用して、偽造したルートパラメータを内部ハンドラーに渡す。これにより、パラメータスマイグリングと組み合わせると、読み取り 操作のすべての認証ガードと、一部の 書き込み 操作の認証ガードがバイパスされます。
author__not_in SQL インジェクションWP_Query クラスは、特定の著者 ID による投稿を除外するための author__not_in パラメータを受け入れます。WP_Query::get_posts() メソッドの型強制バグ (WP 6.9 のクエリサニタイズのリファクタリングで導入) により、特別に細工された連想配列として指定された場合、author__not_in の値が適切なパラメータ化なしに SQL の WHERE 句に直接埋め込まれます。
インジェクションは、生成された SQL の post_author IN (...) 内で発生します。生の SQL フラグメントを含む配列をネストすることで、攻撃者は IN 句を抜け出し、任意の UNION / INTO OUTFILE 文を実行できます — ただし、データベースユーザーが FILE 権限を持っている場合に限ります。
Attacker (unauthenticated)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Bypass auth, invoke internal query API
│ └─ CVE-2026-60137: Inject SQL via author__not_in
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell deployed to web root
│ └─ RCE achieved
バッチエンドポイントは ベクター を提供し、SQLi は ペイロード配信 を提供します。
| バージョン範囲 | 完全なチェーン |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ 両方の CVE が存在 |
| WordPress 7.0.0 – 7.0.1 | ✅ 両方の CVE が存在 |
| WordPress ≤ 6.8.x | CVE-2026-63030 のみ (SQLi は悪用不可) |
パッチは WordPress 6.9.5 および 7.0.2 で提供されました (いずれも 2026-07-16 公開)。
/wp-json/wp/v2/batch が 200 (403/404 ではない) を返すことを確認する。--target フラグを指定して PoC を実行する (下記参照)。/wp-content/webshell.php?cmd=id でウェブシェルを確認する。python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch をブロックする。FILE 権限を削除する。define('DISALLOW_FILE_EDIT', true); と define('DISALLOW_FILE_MODS', true); を有効にする。wp-content/ 配下に予期しない .php ファイルがないか監視する。author__not_in を確認する。