
WordPressログインの反射型HTMLインジェクション(CVE-2026-64638)を悪用してカスタムバナーを表示する自己送信型HTMLトリガーページを生成します。認可されたセキュリティテスト用です。
WordPressの CVE-2026-64638(wp-login.php における反射型HTMLインジェクション、strip_tags() とKSESパーサーの差分)に対する、単一ファイル・依存関係なしのPoCジェネレーターです。自己送信型のトリガーページを生成します。被害者がファイルを開くと、ページはサイレントにインジェクションペイロードをPOSTし、被害者はバナーが描画されたターゲットのログインページに直接誘導されます。操作は不要で、ターゲット側でのJavaScriptも不要です。
認可されたセキュリティテスト専用です。 自分が所有するシステム、または明示的にテストを許可されたシステムに対してのみ使用してください。
| バージョン | ステータス |
|---|
| 6.4.0 – 7.0.2 | 脆弱 — そのまま動作 |
| 5.8 – 6.3 | 条件付き — login_errors を style 許可付きで wp_kses() に通すプラグインが必要 |
| 4.7 – 5.7 | 悪用不可(ユーザー名が反映されない) |
| 6.4.9 / 6.5.9 / 6.6.6 / 6.7.6+ / 6.8.7 / 6.9.6 / 7.0.3+ | 修正済み(esc_html) |
python3 banner_poc.py \
--out trigger.html \
--target http://192.0.2.10/wp-login.php \
--msg "Scheduled System Maintenance"
# サブディレクトリ + 隠しログインパス + サブタイトル
python3 banner_poc.py \
--out trigger.html \
--target http://10.0.0.5:8080/blog/my-secret-login \
--msg "Please sign in again" --sub "Session expired"
trigger.html を任意の場所にホストします。被害者が開くと、バナーが描画されたターゲットのログインページにリダイレクトされます。遷移はサイレントです。中間コンテンツは表示されず、背景はWordPressのログイン画面に一致し、約0.5秒で着地します。
| フラグ | 説明 |
|---|---|
--out | 出力HTMLファイル(必須) |
--target | ログインページの完全なURL — サブディレクトリ / 隠しログインパスを含む(必須) |
--msg | バナーテキスト(デフォルト: Scheduled System Maintenance) |
--sub | 任意のサブタイトル行 |
wp-login.php は、ログイン失敗時のユーザー名をエラーメッセージに反映します。脆弱なバージョンでは、これをPHPの strip_tags() でサニタイズしますが、< の後に空白が続くものはすべて通過させます。< div style="..."> は実際の要素として扱われます。< /strong>(スラッシュの前にスペースがあるもの)も strip_tags() を生き残り、実際の終了タグに再構築されます。これにより、ペイロードはテンプレートの <strong>(HTML5のアクティブフォーマット要素)を最初のトークンとして閉じ、DOMを完全に制御できます。div が、テンプレートの末尾テキスト(「… is not registered on this site …」)を吸収します。class を使用しないインラインスタイルを使用し、safecss_filter_attr() を生き残ります。6.3+ / 6.4+ では position:fixed が全画面オーバーレイを描画します。5.8–6.2 ではこれらのプロパティは除去され、同じペイロードが自動的にインラインフローの赤いバナーに劣化します。純粋なHTML/CSS — ターゲット上でJavaScriptは実行されません。<script> やイベントハンドラを対象としたWAFルールは適用されません。
このツールは、防御研究および認可された侵入テストのために公開されています。作者は不正使用について責任を負いません。