
WP2Shell WordPress脆弱性チェーンのPoC検出器&安全な検証ツール: CVE-2026-63030 (RESTバッチルート混乱) + CVE-2026-60137 (author__not_in SQLインジェクション)。許可されたセキュリティテスト専用です。
CVE 対象: CVE-2026-63030 および CVE-2026-60137 想定用途: 許可されたセキュリティテスト、防御的検証、および使い捨ての localhost ラボのみ
WP2Shell は、事前認証 REST API バッチルート混乱バグ (CVE-2026-63030) と、WP_Query の author__not_in SQL インジェクションプリミティブ (CVE-2026-60137) を組み合わせた WordPress Core の脆弱性チェーンです。このリポジトリは、防御者が影響を受ける WordPress インストールを識別し、隔離されたラボで脆弱な動作を確認し、修正を検証できるようにする Python の概念実証スキャナおよび安全なバリデータを提供します。データの抽出やコード実行の達成は必要ありません。
このプロジェクトは WordPress インストールを識別し、WP2Shell WordPress Core 脆弱性チェーンに関連する 2 つの脆弱性プリミティブを検証します。
WP_Query::author__not_in の不完全なサニタイズ。攻撃者が制御する入力がパラメータに到達すると、SQL インジェクションにつながる可能性があります。両方の条件が存在する場合、認証されていないリクエストが WordPress REST API バッチエンドポイントを通じて脆弱な SQL 構築に到達する可能性があります。公開アドバイザリは、組み合わせた影響がリモートコード実行につながる可能性があると説明しています。
このリポジトリは、自分が所有するシステム、または明示的にテストを許可されたシステムでのみ使用してください。127.0.0.1 にバインドされた隔離された Docker または仮想マシンラボを推奨します。
現在のソースファイルには、データベースデータの抽出試行、ファイル書き込み試行、認証ワークフロー、管理者作成、プラグインアップロード、コマンド実行など、状態を変更する機能が含まれています。
影響を受ける WordPress リリースでは、次の追跡に使用される内部配列間の整合性が失われる可能性があります。
不正な形式のバッチメンバーがある内部配列には受け入れられても別の配列には受け入れられない場合、後続のリクエストが誤ったハンドラに関連付けられる可能性があります。したがって、リクエストがあるルートとして検証されても、別のルートのコールバックを使用して実行される可能性があります。
セキュリティへの影響:
author__not_in SQLインジェクション影響を受ける WP_Query 実装は、SQL の NOT IN (...) 条件を構築する前に author__not_in を一貫して正規化しません。
このパラメータは通常、整数の著者 ID のリストを想定しています。スカラー文字列が、意図された REST スキーマ検証を受けずに脆弱なクエリ構築に到達した場合、安全でない SQL 構造がデータベースクエリに残る可能性があります。
セキュリティへの影響:
| WordPress ブランチ | 影響の内容 | 修正版 |
|---|---|---|
| 6.8.x | CVE-2026-60137 のみ: 6.8.0–6.8.5 | 6.8.6 |
| 6.9.x | 両方の問題: 6.9.0–6.9.4 | 6.9.5 |
| 7.0.x | 両方の問題: 7.0.0–7.0.1 | 7.0.2 |
| 7.1 prerelease | Beta 1 が影響 | Beta 2 |
| 6.8 より前 | これら 2 つの CVE の影響なし | N/A |
WordPress は 2026 年 7 月 17 日に修正をリリースし、深刻度のため影響を受けるインストールに対して強制自動更新を有効にしました。
Unauthenticated client | v WordPress REST batch endpoint | v Malformed batch member creates request/handler misalignment | v Later request is validated against one route but dispatched using another route's handler | v Scalar author_exclude reaches WP_Query as author__not_in | v Unsafe value reaches SQL NOT IN (...) construction | v Blind SQL timing or Boolean oracle | v Potential database compromise | v Potential application-level compromise and RCE
検出器は、ルート混同(route-confusion)とSQLインジェクションのプリミティブを確認した時点で停止する必要があります。影響を受けるインストールが脆弱であることを立証するために、データを抽出したりコマンドを実行したりする必要はありません。
---
## 検出ワークフロー
### フェーズ1 — ターゲットの正規化
このツールは次のことを行います:
1. 欠落している場合は、既定の`http`または`https`スキームを追加します。
2. WordPressインストールパスを正規化します。
3. サポートされていないURLスキームと埋め込まれた資格情報を拒否します。
4. リダイレクト、プロキシ、TLS、タイムアウトの各ポリシーを適用します。
### フェーズ2 — WordPressの識別
スキャナは以下をチェックします:
- `wp-content/`への参照。
- `wp-includes/`への参照。
- WordPressジェネレーターメタデータ。
- REST APIディスカバリーリンク。
- WordPress RESTインデックス構造。
- `wp/v2`名前空間。
- オプションのフィードおよび`readme.html`フィンガープリント。
### フェーズ3 — バージョンの特定
バージョンの証拠は以下から得られます:
- HTMLジェネレーターメタデータ。
- フィードジェネレーターメタデータ。
- WordPressコアアセットのクエリ文字列。
- HTTPジェネレーターヘッダー。
- `readme.html`。
- ローカルの`wp-includes/version.php`ファイル。
証拠はスコアリングされ、調整されます。競合するリモートバージョン指標は信頼度を下げます。
### フェーズ4 — バッチルートの露出確認
スキャナは、以下を通じて`/batch/v1`の発見を試みます:```text
/?rest_route=/
/wp-json/
ルートは、次のいずれかを使用してアクセスできます:```text /?rest_route=/batch/v1 /wp-json/batch/v1
### フェーズ5 — 安全なルート混乱プローブ
この安全なプローブには次のものが含まれています:
1. 意図的に不正な形式にした内部パス。
2. 無害なネストされたパブリック`GET`を伴う、無効な投稿IDへのリクエスト。
3. それに続く`/batch/v1`リクエスト。
脆弱なサーバーは、無効な投稿リクエストがネストされたバッチリクエストとして処理される、外側の`207 Multi-Status`レスポンスを返します。
検出器は次のように報告します:```text
route-confusion-observed
次の場合です。
parse_path_failed マーカー。207 の2番目の外部レスポンス。responses 配列。非破壊的なSQLiバリデータは、定数ブール条件のみが異なるペアのリクエストを送信する必要があります。```text False control -> no deliberate database delay True test -> deliberate database delay
The validator must:
- Accept the expected outer HTTP `207`.
- Parse both the outer and nested batch envelopes.
- Verify the malformed-request markers.
- Ensure the SQLi-bearing nested request returned a valid response.
- Collect multiple true and false samples.
- Randomize or interleave sample order.
- Compare medians rather than a single request.
- Report insufficient measurements as `inconclusive`.
A repeatable gap between true and false samples confirms that attacker-controlled input reached SQL evaluation. No database contents need to be selected or extracted.
---
## Requirements
- Python 3.9 or later.
- No third-party Python packages are required by the supplied script.
- Network access to the authorized WordPress installation.
- For local testing:
- A disposable WordPress 7.0.1 or 6.9.4 lab.
- A database container or dedicated test database.
- The web service bound to `127.0.0.1`.
- No production credentials or data.
Check Python:
バリデーターは以下を行う必要があります:
- 期待される外側のHTTP `207`を受け入れること。
- 外側とネストされたバッチエンベロープの両方を解析すること。
- 不正なリクエストマーカーを検証すること。
- SQLiを含むネストされたリクエストが有効なレスポンスを返したことを確認すること。
- 複数のtrueおよびfalseサンプルを収集すること。
- サンプル順序をランダム化またはインターリーブすること。
- 単一のリクエストではなく中央値を比較すること。
- 不十分な測定を`inconclusive`として報告すること。
trueとfalseのサンプル間の再現可能なギャップは、攻撃者が制御する入力がSQL評価に到達したことを裏付けます。データベースの内容を選択または抽出する必要はありません。
---
## 要件
- Python 3.9以降。
- 提供されるスクリプトにはサードパーティのPythonパッケージは不要です。
- 許可されたWordPressインストールへのネットワークアクセス。
- ローカルテストの場合:
- 使い捨てのWordPress 7.0.1または6.9.4ラボ。
- データベースコンテナまたは専用のテストデータベース。
- `127.0.0.1`にバインドされたWebサービス。
- 本番環境の認証情報やデータは使用しません。
Pythonを確認:```bash
python3 --version
オプションの構文検証:```bash python3 -m py_compile WP2Shell_CVE-2026-63030_POC.py
---
## インストール
同梱されているスクリプトを予測可能なファイル名に変更してください:```bash
mv 'poc(1).py' WP2Shell_CVE-2026-63030_POC.py
chmod +x WP2Shell_CVE-2026-63030_POC.py
グローバルヘルプを表示:```bash python3 WP2Shell_CVE-2026-63030_POC.py --help
バージョンを表示:```bash
python3 WP2Shell_CVE-2026-63030_POC.py --version
スクリプトは3つのコマンドを定義しています:```text remote Fingerprint and scan HTTP(S) WordPress targets. local Read the installed WordPress version from a source tree. exploit State-changing proof-of-concept path.
### 現在のビルド状況
| コマンド | ステータス |
|---|---|
| `local` | 実装済み |
| `remote` | CLIは定義されていますが、`run_remote()` は現在スタブであり、エラーを返します |
| `exploit` | 状態を変更する機能を含みます。使い捨てのローカルラボに制限し、防御的スキャニングから分離してください |
ソースは現在、`remote` について次のように出力します:```text
Remote scanning not fully implemented in this snippet. Use 'local' or 'exploit'.
Restore a complete run_remote() implementation before advertising bulk remote scanning as functional.
local コマンドは以下を読み取ります:```text
/wp-includes/version.php
そして `$wp_version` を抽出します。