mhtsec/CVE-2026-63030
GitHub: mhtsec/CVE-2026-63030
WordPress REST API 未授权 RCE 漏洞(CVE-2026-63030)的完整利用链 PoC,实现从 SQL 注入到管理员创建再到远程命令执行的攻击复现。
Stars: 5 | Forks: 4
# CVE-2026-63030
WordPress REST API **batch 路由混淆 + SQL 注入** 导致 **未授权创建管理员 → 远程代码执行** 的完整利用链 PoC。
## 漏洞概述
| 项目 | 说明 |
|------|------|
| CVE | CVE-2026-63030 |
| 组件 | WordPress Core REST API (`/batch/v1`) |
| 影响版本 | WordPress **6.9.0 – 6.9.4**、**7.0.0 – 7.0.1**(以官方公告为准) |
| 攻击前提 | 目标开启 REST API batch;站点至少有一篇已发布的文章或页面 |
| 权限要求 | **无需登录(Pre-Auth)** |
| 危害 | 创建管理员账号,并可进一步上传插件实现 RCE |
## 攻击链路
REST batch 路由混淆
→ author__not_in SQL 注入
→ UNION 伪造 WP_Post / oEmbed cache / Customizer changeset
→ Customizer 发布时切换为已有管理员上下文
→ REST /wp/v2/users 创建新管理员
→ 后台上传一次性插件
→ 执行系统命令
核心不是“堆叠写库”,而是:
1. `serve_batch_request_v1()` 校验阶段与调度阶段对 `$matches` / `$validation` 索引不同步,造成 **route confusion**。
2. 错位后,字符串形式的 `author_exclude` 进入 `WP_Query` 的 `author__not_in`,拼进 `NOT IN (...)`,形成 **SQL 注入**。
3. 通过 `UNION SELECT` 伪造完整 `wp_posts` 行,触发 oEmbed / Customizer 逻辑,把当前用户上下文切换为已有管理员。
4. 以管理员身份调用 REST 用户创建接口,写入新管理员。
5. 登录后台上传插件,实现命令执行。
## 环境要求
- Python **3.10+**(仅标准库,无第三方依赖)
- 目标为你有权测试的 WordPress 实例
- 目标 PHP 至少保留一种可执行函数(`proc_open` / `passthru` / `system` / `shell_exec` / `exec` / `popen` 之一)
- 若 `disable_functions` 禁用了全部命令执行函数,仍可成功创建管理员,但 RCE 阶段会失败
## 文件说明
CVE-2026-63030/
├── exp.py # 完整利用脚本(单文件,零依赖)
└── README.md # 本说明
## 使用方法
### 最简用法(自动生成管理员,默认执行 `id`)
python3 exp.py --url http://192.168.1.10:8080/
### 自定义全部参数
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email mht@bdziyi.com --command 'id' --timeout 60
### 参数说明
| 参数 | 必填 | 默认值 | 说明 |
|------|------|--------|------|
| `--url` | 是 | 无 | 目标 WordPress 根 URL |
| `--username` | 否 | `wp2_` | 要创建的管理员用户名 |
| `--password` | 否 | `Wp2!` | 要创建的管理员密码 |
| `--email` | 否 | `@wp2shell.invalid` | 要创建的管理员邮箱 |
| `--command` / `-c` | 否 | `id` | 通过一次性插件执行的命令 |
| `--timeout` | 否 | `60` | 单次 HTTP 超时(秒) |
## 预期输出示例
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: labadmin@lab.local
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
脚本会在结束后尝试:
1. 删除本次创建的管理员
2. 删除临时插件目录
若中途失败,请根据输出中的账号密码手动清理。
## 注意事项
1. **仅授权环境**:请勿对未授权系统使用。
2. **目标限制**:脚本默认拒绝公网 IP 字面量目标,仅允许私网 / 回环 / 链路本地地址,或域名形式目标。
3. **PHP 加固**:若出现 `has been disabled for security reasons`,说明 `disable_functions` 禁用了对应函数。PoC 会依次尝试多种执行方式;若全部被禁,RCE 不可用,但管理员创建阶段仍可能成功。
4. **站点内容**:需要至少一篇已发布文章或页面,用于种子 oEmbed cache。
5. **幂等与清理**:每次运行会创建新管理员与临时插件,成功路径会自动清理;失败时请人工检查 `wp-admin/users.php` 与 `wp-content/plugins/`。
## 修复建议
- 升级到官方已修复版本(以 WordPress 安全公告为准)
- 在补丁不可用时,可临时限制对 `/batch/v1` 的未授权访问
- 生产环境保持 `disable_functions` 与最小权限 Web 用户配置,降低 RCE 落地影响
## Disclaimer
本仓库中的代码仅用于安全研究与授权漏洞复现。使用者需自行确保遵守当地法律法规及目标系统授权范围。作者不对任何滥用行为承担责任。
标签:CISA项目, PNNL实验室, Web报告查看器, WordPress, 编程工具, 网络安全, 远程代码执行, 逆向工具, 隐私保护