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, 编程工具, 网络安全, 远程代码执行, 逆向工具, 隐私保护