
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 は 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` を抽出します。
## 基本的な使い方```bash
python3 WP2Shell_CVE-2026-63030_POC.py local \
--wordpress-root /var/www/html
python3 WP2Shell_CVE-2026-63030_POC.py local
--wordpress-root /var/www/html
--format json
--output local-result.json
## DockerベースのWordPressインストール
WordPressコンテナの名前が`wordpress`の場合、ソースツリーをホストにコピーまたはマウントするか、コンテナ内でバージョンチェックを実行します:```bash
docker compose exec wordpress php -r \
'require "/var/www/html/wp-includes/version.php"; echo $wp_version, PHP_EOL;'
提供されている compose.yaml を使用して、127.0.0.1:8080 にバインドされた使い捨てのローカルラボを実行します:```bash
docker compose up -d
ブラウザで `http://127.0.0.1:8080` にアクセスして初回のWordPressセットアップが完了したら、次を実行できます:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target http://127.0.0.1:8080 \
--active-probe \
--format json
ラボを停止して削除するには:```bash docker compose down -v
## ローカルコマンドオプション
| オプション | 説明 |
|---|---|
| `--wordpress-root PATH` | `wp-includes/version.php` を含む必須ディレクトリ |
| `-f, --format` | `table`、`json`、`jsonl`、または `csv` |
| `-o, --output FILE` | レポートをファイルに書き込む |
| `--fail-on` | 終了コードポリシー: `never`、`vulnerable`、または `unknown` |
## 脆弱性バージョン出力の例```json
[
{
"selected_version": "7.0.1",
"version_assessment": "affected-wp2shell",
"verdict": "CONFIRMED_AFFECTED_VERSION",
"severity": "critical"
}
]
ローカルバージョンの結果は、インストールされているリリースが公開された影響範囲内にあることを確認します。それ自体は、実行時の悪用可能性やバックポートされたパッチの効果を実証するものではありません。
remote パーサーは以下の引数をサポートしていますが、提供されている run_remote() 実装は現在不完全です。
run_remote() を復元した後の期待されるインターフェース:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote
--authorized
--target https://wordpress.example
--active-probe
## 複数の明示的ターゲット```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://site-one.example \
--target https://site-two.example \
--active-probe
targets.txt を作成します:```text
https://site-one.example/
https://site-two.example/blog/
期待されるインターフェース:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--targets-file targets.txt \
--active-probe \
--format jsonl \
--output results.jsonl
cat targets.txt | python3 WP2Shell_CVE-2026-63030_POC.py remote
--authorized
--stdin
## プロキシの使用```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://wordpress.example \
--active-probe \
--proxy http://127.0.0.1:8081
python3 WP2Shell_CVE-2026-63030_POC.py remote
--authorized
--target https://wordpress.example
--header 'Authorization: Bearer TEST_TOKEN'
| Option | 目的 |
|---|---|
| `-u, --target URL` | 対象URL; 繰り返し指定可能 |
| `-l, --targets-file FILE` | 1行に1ターゲット; 繰り返し指定可能 |
| `--stdin` | stdin からターゲットを読み取る |
| `--authorized` | 認可済みであることの確認を必須にする |
| `--default-scheme` | 省略時に適用されるスキーム |
| `-c, --concurrency` | 同時に実行するターゲットワーカー数 |
| `--rate` | 合計リクエストレート |
| `--timeout` | リクエストごとのタイムアウト |
| `--retries` | 再試行回数 |
| `--max-targets` | 受け入れるターゲットの最大数 |
| `--max-body-bytes` | 保持するレスポンスボディの最大バイト数 |
| `-k, --insecure` | TLS 検証を無効化 |
| `--no-redirects` | リダイレクトを無効化 |
| `--allow-cross-host-redirects` | 別ホストへのリダイレクトを許可 |
| `--proxy` | HTTP/HTTPS プロキシ |
| `-H, --header` | カスタムヘッダー; 繰り返し指定可能 |
| `--user-agent` | User-Agent を上書き |
| `--fingerprint-level` | `quick`、`standard`、または `extended` |
| `--active-probe` | 安全なルート混乱プローブを送信 |
| `--rest-endpoint` | `query`、`pretty`、または `both` |
| `--include-request-log` | URL、ステータス、タイミングのメタデータを追加 |
| `-f, --format` | `table`、`json`、`jsonl`、または `csv` |
| `-o, --output` | 出力をファイルに書き込む |
| `--fail-on` | 終了コードポリシー |
---
# 安全なランタイム検証
両方のプリミティブを非破壊的にローカル検証するには、専用のバリデーターを使用します:
- ループバック以外のホストを拒否する。
- まずルート混乱を確認する。
- ルート混乱が成功した後でのみ、一定条件のタイミングサンプルを実行する。
- データの抽出やコマンドの実行を行わない。
ワークフロー例:```bash
python3 wp2shell_local_validator.py check \
--authorized \
--target http://127.0.0.1:8080 \
--sqli \
--delay 2 \
--samples 4 \
--warmups 2 \
--debug \
--dump-dir evidence \
--output result.json
予期される脆弱性ラボのタイミングパターン:```text False controls: approximately 0.03–0.10 seconds True tests: consistently delayed
期待される判定:```text
FULL_VULNERABILITY_PRIMITIVES_CONFIRMED
タイミングテストでは、遅延式が複数回実行されることがあるため、設定した2秒の遅延でも、観測される遅延は4秒近くになる場合があります。重要なシグナルは、true条件とfalse条件の間で再現性のある分離が見られることです。
インタラクティブなターミナルでの使用に最適です:```bash --format table
### JSON
証拠と統合に最適:```bash
--format json --output result.json
大規模なターゲットセットに最適:```bash --format jsonl --output results.jsonl
### CSV
スプレッドシートやレポートに最適:```bash
--format csv --output results.csv
スキャナはポリシー駆動の終了コードを使用します。
| コード |
|---|
したがって、脆弱性の検出結果は意図的に非ゼロのステータスを返すことがあります。
例:```bash
python3 WP2Shell_CVE-2026-63030_POC.py local
--wordpress-root /var/www/html
--fail-on vulnerable
echo $?
---
## 脆弱バージョンと修正バージョンの差分テスト
強力な検証では、2つのクリーンな環境を比較します。
### 脆弱な環境```text
WordPress 7.0.1
I apologize, but I notice that the content to translate appears to be missing from your message. The input field is empty—no actual Markdown content was provided for chunk 73 of 85.
Please provide the source text, and I'll translate it into Japanese following all the specified rules.```text route-confusion-observed repeatable true/false SQL timing difference
### 固定環境```text
WordPress 7.0.2
期待:```text route-confusion-not-observed SQLi timing test not reached or no valid timing oracle
WordPressのバージョンを変更するときは、常にWordPressボリュームを再作成してください。ボリュームを再利用すると、古い、または自動更新されたコアファイルが保持される可能性があります。```bash
docker compose down -v
docker compose pull
docker compose up -d
直ちに、以下の修正済みリリースまたはそれ以降のサポート対象リリースに更新してください:
一時的な対策は、バッチエンドポイントの両方の形式を対象とする必要があります。```text /wp-json/batch/v1 /?rest_route=/batch/v1
追加の防御措置:
1. 匿名のバッチリクエスト、不正な内部URL、ネストされたバッチ構造、異常な`author_exclude`値をログで確認する。
2. 外部に露出した期間があれば、管理者アカウント、プラグインの変更、予期しないPHPファイル、データベースアクセスを確認する。
3. WordPress Coreのチェックサムを検証し、侵害が疑われる場合は既知の正常なバックアップから復元する。
4. SQLインジェクションの悪用が発生した可能性がある場合は、WordPressデータベースに保存されているシークレットと認証情報をローテーションする。
エンドポイントのブロックは一時的な緩和策であり、WordPress Coreの更新に代わるものではない。
---
## 検出のアイデア
潜在的な指標には以下が含まれます:
- いずれかのバッチエンドポイント形式への匿名`POST`リクエスト。
- ネストされた`responses`配列を含むHTTP `207`レスポンス。
- バッチリクエストボディ内の不正な内部URL。
- 別のバッチメンバー内にネストされた`requests`オブジェクト。
- スカラーまたはSQL形式の`author_exclude`値。
- 高速レスポンスと遅延レスポンスが交互に発生する、繰り返されるペアのリクエスト。
- 予期しないWordPress管理者の作成。
- 予期しないプラグインのインストールまたは有効化。
- 書き込み可能なWordPressディレクトリ配下の新しいPHPファイル。
- 異常な`author__not_in`式を含むデータベースクエリ。
---
## 提供スクリプトの既知の制限事項
- Cookie処理は、永続的なブラウザセッションと同等ではない。
- 一部のコードパスでは、データベースのテーブルプレフィックスが前提とされている。
- データベースの`FILE`権限とファイルシステムパスは、デプロイ環境によって異なる。
- `INTO OUTFILE`は通常制限されており、既存のファイルを上書きすることはできない。
- WordPressは`DISALLOW_FILE_MODS`によってプラグインのインストールを無効化することがある。
- タイミングのしきい値は、プロキシ、WAF、PHPタイムアウト、データベースタイムアウト、負荷の影響を受ける可能性がある。
- バージョン文字列は、非表示、偽装、キャッシュ、または不整合になる可能性がある。
- 影響を受けるバージョンが観測されても、セキュリティバックポートがないことの証明にはならない。
- タイミングシグナルが欠落していても、サーバーがパッチ適用済みであることの証明にはならない。
---
## 参照
- WordPress 7.0.2 セキュリティリリース:
https://wordpress.org/news/2026/07/wordpress-7-0-2-release/
- WordPress 7.0.2 ドキュメントと変更ファイル:
https://wordpress.org/documentation/wordpress-version/version-7-0-2/
- NVD — CVE-2026-63030:
https://nvd.nist.gov/vuln/detail/CVE-2026-63030
- NVD — CVE-2026-60137:
https://nvd.nist.gov/vuln/detail/CVE-2026-60137
- WordPress リリースアーカイブ:
https://wordpress.org/download/releases/
---
## 法的および倫理的な使用
以下の場合にのみこのプロジェクトを使用してください:
- システムを所有している場合、または
- 明示的な書面による許可を得ている場合、かつ
- 要求されたテスト活動が合意された範囲内である場合。
意図的に脆弱なWordPressインストールを公開インターネットにさらさないでください。使い捨ての認証情報、合成データ、隔離されたネットワーク、クリーンなスナップショットを使用してください。テスト後はラボを破棄またはリセットしてください。
脆弱性の最も安全な証明は、問題を実証するために必要な最小限のエビデンスです:```text
Affected version
+
Route-confusion behavior
+
Repeatable constant-condition SQL timing oracle
認証情報の窃取、永続化、Webシェルのインストール、およびコマンド実行は、脆弱性が存在することを確認するためには不要です。
| 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 |
| 判定 | 意味 |
|---|
CONFIRMED_VULNERABLE_BEHAVIOR | 実行時の route-confusion 動作が観測された |
CONFIRMED_AFFECTED_VERSION | ローカルのソースバージョンが影響を受ける範囲にある |
LIKELY_VULNERABLE | リモートのバージョン情報が影響を受けるリリースを示している |
VULNERABLE_SQLI_ONLY | バージョンは CVE-2026-60137 の影響を受けるが、完全な route-confusion 範囲外 |
AFFECTED_VERSION_BUT_BEHAVIOR_NOT_OBSERVED | 影響を受けるバージョンが検出されたが、安全な実行時動作は確認されなかった |
PATCHED_VERSION | バージョンが公開済みの修正境界を満たしている |
NOT_AFFECTED | バージョンが影響を受けるブランチの外にある |
POTENTIALLY_EXPOSED_VERSION_UNKNOWN | WordPress とバッチルートは見つかったが、バージョンが隠されている |
WORDPRESS_VERSION_UNKNOWN | WordPress は検出されたが、信頼できるバージョン情報がない |
ERROR | ターゲットを評価できなかった |
NOT_WORDPRESS_OR_NOT_DETECTED | 信頼できる WordPress の証拠がない |
| 意味 |
|---|
0 | ポリシーをトリガーする結果がない、または --fail-on never |
2 | デフォルトポリシーで脆弱または影響を受ける結果 |
3 | --fail-on unknown 選択時に不明または結論が出ない結果 |
1 | 引数、入力、または不完全なコマンドのエラー |