Bhanunamikaze/WP2Shell-CVE-2026-63030-POC
GitHub: Bhanunamikaze/WP2Shell-CVE-2026-63030-POC
一款针对 WordPress WP2Shell 漏洞链(CVE-2026-63030 + CVE-2026-60137)的 PoC 检测器与安全验证器,用于非破坏性地指纹识别受影响的安装并确认漏洞行为。
Stars: 0 | Forks: 0
# WP2Shell 检测与验证 PoC
[](LICENSE)
[](https://www.python.org/downloads/)
[](https://nvd.nist.gov/vuln/detail/CVE-2026-63030)
[](https://nvd.nist.gov/vuln/detail/CVE-2026-60137)
[](#legal-and-ethical-use)
WP2Shell 是一个 WordPress Core 漏洞链,它结合了一个预认证的
REST API 批量路由混淆 bug (**CVE-2026-63030**) 和一个 `WP_Query`
`author__not_in` SQL 注入原语 (**CVE-2026-60137**)。此代码库
提供了一个 Python 概念验证扫描器和安全验证器,以便防御者可以
指纹识别受影响的 WordPress 安装,在隔离的实验环境中确认易受攻击的行为,并验证修复情况——而无需提取数据
或实现代码执行。
## 概述
本项目对 WordPress 安装进行指纹识别,并验证与 **WP2Shell** WordPress Core 漏洞链相关的两个漏洞原语:
- **CVE-2026-63030** — REST API 批量路由混淆。
- **CVE-2026-60137** — `WP_Query::author__not_in` 的清理不完整,当攻击者控制的输入到达该参数时可能导致 SQL 注入。
当这两个条件同时存在时,未经身份验证的请求可能会通过 WordPress REST API 批量端点到达易受攻击的 SQL 构造逻辑。公开的安全公告将这种组合影响描述为可能导致远程代码执行。
此代码库仅应用于您拥有或明确获得授权进行测试的系统。建议使用绑定到 `127.0.0.1` 的隔离 Docker 或虚拟机实验环境。
## 安全提示
当前的源文件包含改变状态的功能,包括数据库数据提取尝试、文件写入尝试、身份验证工作流、管理员创建、插件上传和命令执行。
- WordPress 指纹识别。
- 版本评估。
- 本地源代码树版本检查。
- 安全的路由混淆验证。
- 在隔离的实验环境中进行非破坏性的、基于时间的 SQL 注入确认。
- 报告、证据收集和修复。
## 漏洞总结
### CVE-2026-63030 — REST API 批量路由混淆
受影响的 WordPress 版本可能会在用于跟踪以下内容的内部数组之间失去一致性:
- 已解析的批量请求。
- 匹配的 REST 路由处理器。
- 验证结果。
当格式错误的批量成员被其中一个内部数组接受,但未被另一个接受时,后续的请求可能会与错误的处理器关联。因此,一个请求可能会被作为某一个路由进行验证,但却使用另一个路由的回调来执行。
**安全影响:**
- REST 请求/处理器不同步。
- 针对错误的路由 schema 进行验证。
- 意外的嵌套批量执行。
- 预认证即可触达原本受限的代码路径。
- 当与 CVE-2026-60137 结合使用时,可能导致 SQL 注入和进一步的破坏。
### CVE-2026-60137 — `author__not_in` SQL 注入
受影响的 `WP_Query` 实现在使用 `author__not_in` 构造 SQL `NOT IN (...)` 条件之前,并未对其进行一致的规范化处理。
该参数通常需要一个整数作者 ID 列表。如果标量字符串在未经过预期的 REST schema 验证的情况下到达易受攻击的查询构造逻辑,不安全的 SQL 结构可能会残留在数据库查询中。
**安全影响:**
- 盲注 SQL 注入。
- 基于布尔或时间的数据库盲注。
- WordPress 数据库内容的潜在泄露。
- 当与 CVE-2026-63030 组合使用时影响会加剧。
## 受影响版本
| WordPress 分支 | 受影响情况 | 修复版本 |
|---|---:|---:|
| 6.8.x | 仅 CVE-2026-60137:6.8.0–6.8.5 | 6.8.6 |
| 6.9.x | 两个问题都有:6.9.0–6.9.4 | 6.9.5 |
| 7.0.x | 两个问题都有:7.0.0–7.0.1 | 7.0.2 |
| 7.1 预发布版本 | Beta 1 受影响 | Beta 2 |
| 6.8 之前版本 | 不受这两个 CVE 影响 | N/A |
WordPress 于 2026 年 7 月 17 日发布了修复程序,并由于严重性为受影响的安装启用了强制自动更新。
## 漏洞工作流
```
Unauthenticated client
|
v
WordPress REST batch endpoint
|
v
Malformed batch member creates request/handler misalignment
|
v
Later request is validated against one route
but dispatched using another route's handler
|
v
Scalar author_exclude reaches WP_Query as author__not_in
|
v
Unsafe value reaches SQL NOT IN (...) construction
|
v
Blind SQL timing or Boolean oracle
|
v
Potential database compromise
|
v
Potential application-level compromise and RCE
```
检测器应在确认路由混淆和 SQL 注入原语后停止。它不需要提取数据或执行命令来证明受影响的安装存在漏洞。
## 检测工作流
### 阶段 1 — 规范化目标
该工具:
1. 如果缺少,则添加默认的 `http` 或 `https` 协议。
2. 规范化 WordPress 安装路径。
3. 拒绝不支持的 URL 协议和嵌入的凭据。
4. 应用重定向、代理、TLS 和超时策略。
### 阶段 2 — 识别 WordPress
扫描器检查:
- `wp-content/` 引用。
- `wp-includes/` 引用。
- WordPress 生成器元数据。
- REST API 发现链接。
- WordPress REST 索引结构。
- `wp/v2` 命名空间。
- 可选的 feed 和 `readme.html` 指纹。
### 阶段 3 — 确定版本
版本证据可以来自:
- HTML 生成器元数据。
- Feed 生成器元数据。
- WordPress 核心资源查询字符串。
- HTTP 生成器标头。
- `readme.html`。
- 本地的 `wp-includes/version.php` 文件。
证据会被评分和核对。冲突的远程版本指标会降低置信度。
### 阶段 4 — 检查批量路由暴露情况
扫描器尝试通过以下方式发现 `/batch/v1`:
```
/?rest_route=/
/wp-json/
```
该路由可以通过以下任一方式寻址:
```
/?rest_route=/batch/v1
/wp-json/batch/v1
```
### 阶段 5 — 安全的路由混淆探测
安全探测包含:
1. 一个故意格式错误的内部路径。
2. 一个针对无效 post ID 的请求,附带一个无害的嵌套公共 `GET`。
3. 一个随后的 `/batch/v1` 请求。
易受攻击的服务器会返回一个外部的 `207 Multi-Status` 响应,其中无效的 post 请求被作为嵌套的批量请求进行处理。
检测器在观察到以下情况时会报告:
```
route-confusion-observed
```
当它看到:
- 预期的 `parse_path_failed` 标记。
- 状态为 `207` 的第二个外部响应。
- 显示无害内部请求已运行的嵌套 `responses` 数组。
### 阶段 6 — 基于时间的 SQL 注入确认
非破坏性的 SQL 注入验证器应发送仅在常量布尔条件上有所不同的成对请求:
```
False control -> no deliberate database delay
True test -> deliberate database delay
```
验证器必须:
- 接受预期的外部 HTTP `207`。
- 解析外部和嵌套的批量封装数据。
- 验证格式错误请求的标记。
- 确保包含 SQL 注入的嵌套请求返回了有效的响应。
- 收集多个 true 和 false 样本。
- 随机化或交替样本顺序。
- 比较中位数而不是单个请求。
- 如果测量数据不足,则报告为 `inconclusive`。
true 和 false 样本之间可重复的明显差距证实了攻击者控制的输入已到达 SQL 执行逻辑。无需选择或提取任何数据库内容。
## 环境要求
- Python 3.9 或更高版本。
- 提供的脚本不需要任何第三方 Python 包。
- 到授权 WordPress 安装的网络访问权限。
- 对于本地测试:
- 一个一次性的 WordPress 7.0.1 或 6.9.4 实验环境。
- 一个数据库容器或专用测试数据库。
- 绑定到 `127.0.0.1` 的 Web 服务。
- 没有生产环境的凭据或数据。
检查 Python:
```
python3 --version
```
可选的语法验证:
```
python3 -m py_compile WP2Shell_CVE-2026-63030_POC.py
```
## 安装
将提供的脚本重命名为一个可预测的文件名:
```
mv 'poc(1).py' WP2Shell_CVE-2026-63030_POC.py
chmod +x WP2Shell_CVE-2026-63030_POC.py
```
显示全局帮助:
```
python3 WP2Shell_CVE-2026-63030_POC.py --help
```
显示版本:
```
python3 WP2Shell_CVE-2026-63030_POC.py --version
```
## 命令
该脚本定义了三个命令:
```
remote Fingerprint and scan HTTP(S) WordPress targets.
local Read the installed WordPress version from a source tree.
exploit State-changing proof-of-concept path.
```
### 当前构建状态
| 命令 | 状态 |
|---|---|
| `local` | 已实现 |
| `remote` | CLI 已定义,但 `run_remote()` 目前是一个存根,并返回错误 |
| `exploit` | 包含改变状态的功能;仅限于一次性的本地实验环境,并将其与防御性扫描分开 |
源码当前针对 `remote` 打印以下内容:
```
Remote scanning not fully implemented in this snippet. Use 'local' or 'exploit'.
```
在将批量远程扫描宣传为功能可用之前,请恢复完整的 `run_remote()` 实现。
# 本地版本评估
`local` 命令读取:
```
/wp-includes/version.php
```
并提取 `$wp_version`。
## 基本用法
```
python3 WP2Shell_CVE-2026-63030_POC.py local \
--wordpress-root /var/www/html
```
## JSON 报告
```
python3 WP2Shell_CVE-2026-63030_POC.py local \
--wordpress-root /var/www/html \
--format json \
--output local-result.json
```
## 基于 Docker 的 WordPress 安装
当 WordPress 容器命名为 `wordpress` 时,将源代码树复制或挂载到主机,或者在容器内运行版本检查:
```
docker compose exec wordpress php -r \
'require "/var/www/html/wp-includes/version.php"; echo $wp_version, PHP_EOL;'
```
## 使用 compose.yaml 设置易受攻击的实验环境
使用提供的 `compose.yaml` 运行绑定到 `127.0.0.1:8080` 的一次性本地实验环境:
```
docker compose up -d
```
一旦在浏览器中通过 `http://127.0.0.1:8080` 完成了首次 WordPress 设置,您就可以运行:
```
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target http://127.0.0.1:8080 \
--active-probe \
--format json
```
停止并移除实验环境:
```
docker compose down -v
```
## 本地命令选项
| 选项 | 描述 |
|---|---|
| `--wordpress-root PATH` | 必需的包含 `wp-includes/version.php` 的目录 |
| `-f, --format` | `table`、`json`、`jsonl` 或 `csv` |
| `-o, --output FILE` | 将报告写入文件 |
| `--fail-on` | 退出代码策略:`never`、`vulnerable` 或 `unknown` |
## 易受攻击版本的输出示例
```
[
{
"selected_version": "7.0.1",
"version_assessment": "affected-wp2shell",
"verdict": "CONFIRMED_AFFECTED_VERSION",
"severity": "critical"
}
]
```
本地版本结果确认安装的版本处于已公布的受影响范围内。但其本身并不能证明运行时的可利用性或向后移植补丁的效果。
# 远程扫描器接口
`remote` 解析器支持以下参数,但提供的 `run_remote()` 实现目前尚不完整。
## 单一目标
恢复 `run_remote()` 后的预期接口:
```
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://wordpress.example \
--active-probe
```
## 多个显式目标
```
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://site-one.example \
--target https://site-two.example \
--active-probe
```
## 目标文件
创建 `targets.txt`:
```
https://site-one.example/
https://site-two.example/blog/
```
预期接口:
```
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--targets-file targets.txt \
--active-probe \
--format jsonl \
--output results.jsonl
```
## 标准输入
```
cat targets.txt | python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--stdin
```
## 代理使用
```
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://wordpress.example \
--active-probe \
--proxy http://127.0.0.1:8081
```
## 自定义请求标头
```
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://wordpress.example \
--header 'Authorization: Bearer TEST_TOKEN'
```
## 远程选项
| 选项 | 用途 |
|---|---|
| `-u, --target URL` | 目标 URL;可重复使用 |
| `-l, --targets-file FILE` | 每行一个目标;可重复使用 |
| `--stdin` | 从 stdin 读取目标 |
| `--authorized` | 必需的授权确认 |
| `--default-scheme` | 省略时应用的协议 |
| `-c, --concurrency` | 并发目标工作线程 |
| `--rate` | 总请求速率 |
| `--timeout` | 单个请求的超时时间 |
| `--retries` | 重试次数 |
| `--max-targets` | 接受的最大目标数 |
| `--max-body-bytes` | 保留的最大响应主体 |
| `-k, --insecure` | 禁用 TLS 验证 |
| `--no-redirects` | 禁用重定向 |
| `--allow-cross-host-redirects` | 允许重定向到另一台主机 |
| `--proxy` | HTTP/HTTPS 代理 |
| `-H, --header` | 自定义标头;可重复使用 |
| `--user-agent` | 覆盖 User-Agent |
| `--fingerprint-level` | `quick`、`standard` 或 `extended` |
| `--active-probe` | 发送安全的路由混淆探测 |
| `--rest-endpoint` | `query`、`pretty` 或 `both` |
| `--include-request-log` | 添加 URL、状态和计时元数据 |
| `-f, --format` | `table`、`json`、`jsonl` 或 `csv` |
| `-o, --output` | 将输出写入文件 |
| `--fail-on` | 退出代码策略 |
# 安全的运行时验证
为了对两个语进行非破坏性的本地验证,请使用一个专用的验证器,它:
- 拒绝非环回主机。
- 首先确认路由混淆。
- 仅在路由混淆成功后运行常量条件的时间样本。
- 不提取数据或执行命令。
示例工作流:
```
python3 wp2shell_local_validator.py check \
--authorized \
--target http://127.0.0.1:8080 \
--sqli \
--delay 2 \
--samples 4 \
--warmups 2 \
--debug \
--dump-dir evidence \
--output result.json
```
预期的易受攻击实验环境时间模式:
```
False controls: approximately 0.03–0.10 seconds
True tests: consistently delayed
```
预期判定:
```
FULL_VULNERABILITY_PRIMITIVES_CONFIRMED
```
时间测试可以多次执行延迟表达式,因此配置的两秒延迟可能会产生接近四秒的观察延迟。重要的信号是 true 和 false 条件之间可重复的分离。
## 输出格式
### 表格 (Table)
最适合交互式终端使用:
```
--format table
```
### JSON
最适合用于证据和集成:
```
--format json --output result.json
```
### JSON Lines
最适合用于大型目标集:
```
--format jsonl --output results.jsonl
```
### CSV
最适合用于电子表格和报告:
```
--format csv --output results.csv
```
## 判定结果
| 判定 | 含义 |
|---|---|
| `CONFIRMED_VULNERABLE_BEHAVIOR` | 观察到运行时路由混淆行为 |
| `CONFIRMED_AFFECTED_VERSION` | 本地源代码版本处于受影响范围内 |
| `LIKELY_VULNERABLE` | 远程版本证据表明是受影响的版本 |
| `VULNERABLE_SQLI_ONLY` | 版本受 CVE-2026-60137 影响,但超出了完整的路由混淆范围 |
| `AFFECTED_VERSION_BUT_BEHAVIOR_NOT_OBSERVED` | 检测到受影响版本,但未观察到安全的运行时行为 |
| `PATCHED_VERSION` | 版本符合已公布的修复边界 |
| `NOT_AFFECTED` | 版本不在受影响的分支内 |
| `POTENTIALLY_EXPOSED_VERSION_UNKNOWN` | 找到了 WordPress 和批量路由,但版本被隐藏 |
| `WORDPRESS_VERSION_UNKNOWN` | 检测到 WordPress,但没有可靠的版本证据 |
| `ERROR` | 无法评估目标 |
| `NOT_WORDPRESS_OR_NOT_DETECTED` | 没有可靠的 WordPress 证据 |
## 退出代码
扫描器使用基于策略的退出代码。
| 代码 | 含义 |
|---:|---|
| `0` | 没有触发策略的结果,或使用了 `--fail-on never` |
| `2` | 在默认策略下出现的易受攻击或受影响的结果 |
| `3` | 当选择 `--fail-on unknown` 时出现的未知或不确定结果 |
| `1` | 参数、输入或不完整命令的错误 |
因此,漏洞发现可能会特意返回一个非零状态。
示例:
```
python3 WP2Shell_CVE-2026-63030_POC.py local \
--wordpress-root /var/www/html \
--fail-on vulnerable
echo $?
```
## 易受攻击与已修复的对比测试
强有力的验证需要比较两个干净的环境。
### 易受攻击的环境
```
WordPress 7.0.1
```
预期:
```
route-confusion-observed
repeatable true/false SQL timing difference
```
### 已修复的环境
```
WordPress 7.0.2
```
预期:
```
route-confusion-not-observed
SQLi timing test not reached or no valid timing oracle
```
在更改版本时,请务必重新创建 WordPress 卷。重复使用卷可能会保留旧的或自动更新的核心文件。
```
docker compose down -v
docker compose pull
docker compose up -d
```
## 修复方案
立即更新至以下修复版本之一或后续支持的版本:
- WordPress 6.8.6。
- WordPress 6.9.5。
- WordPress 7.0.2。
- WordPress 7.1 beta2 或更高版本,用于预发布测试。
临时控制措施应覆盖两种批量端点形式:
```
/wp-json/batch/v1
/?rest_route=/batch/v1
```
额外的防御措施:
1. 检查日志,查找匿名批量请求、格式错误的内部 URL、嵌套的批量结构以及异常的 `author_exclude` 值。
2. 在任何暴露时间之后,检查管理员账户、插件更改、意外的 PHP 文件以及数据库访问权限。
3. 验证 WordPress Core 校验和,如果怀疑受到攻击,则从已知良好的备份中恢复。
4. 如果可能发生了 SQL 注入攻击,请轮换存储在 WordPress 数据库中的密钥和凭据。
阻止端点只是一种临时缓解措施,不能代替 WordPress Core 的更新。
## 检测思路
潜在的指标包括:
- 针对任一批量端点形式的匿名 `POST` 请求。
- 包含嵌套 `responses` 数组的 HTTP `207` 响应。
- 批量请求主体中格式错误的内部 URL。
- 另一个批量成员内的嵌套 `requests` 对象。
- 标量或 SQL 形式的 `author_exclude` 值。
- 反复出现的、交替具有快速和延迟响应的成对请求。
- 意外创建的 WordPress 管理员。
- 意外安装或激活的插件。
- 可写 WordPress 目录下的新 PHP 文件。
- 包含异常 `author__not_in` 表达式的数据库查询。
## 提供脚本的已知限制
- Cookie 处理不等同于持久的浏览器会话。
- 在某些代码路径中假定了数据库表前缀。
- 数据库的 `FILE` 权限和文件系统路径因部署而异。
- `INTO OUTFILE` 通常受到限制,无法覆盖现有文件。
- WordPress 可能通过 `DISALLOW_FILE_MODS` 禁用插件安装。
- 时间阈值可能会受到代理、WAF、PHP 超时、数据库超时和负载的影响。
- 版本字符串可能会被隐藏、欺骗、缓存或不一致。
- 观察到的受影响版本并不能证明没有进行过安全补丁的向后移植。
- 缺少时间信号并不能证明服务器已修补。
## 参考文献
- WordPress 7.0.2 安全版本发布:
https://wordpress.org/news/2026/07/wordpress-7-0-2-release/
- WordPress 7.0.2 文档和更改的文件:
https://wordpress.org/documentation/wordpress-version/version-7-0-2/
- NVD — CVE-2026-63030:
https://nvd.nist.gov/vuln/detail/CVE-2026-63030
- NVD — CVE-2026-60137:
https://nvd.nist.gov/vuln/detail/CVE-2026-60137
- WordPress 版本归档:
https://wordpress.org/download/releases/
## 合法与道德使用
仅在满足以下条件时使用本项目:
- 您拥有该系统,或者
- 您拥有明确的书面授权,并且
- 请求的测试活动在商定的范围内。
不要将故意设置的易受攻击的 WordPress 安装暴露在公共互联网上。使用一次性凭据、合成数据、隔离的网络和干净的快照。测试后销毁或重置实验环境。
最安全的漏洞证明是展示该问题所需的最少证据:
```
Affected version
+
Route-confusion behavior
+
Repeatable constant-condition SQL timing oracle
```
窃取凭据、建立持久化、安装 webshell 和执行命令对于确认漏洞存在是不必要的。
标签:CISA项目, PoC, Python, WordPress, 无后门, 暴力破解, 请求拦截, 逆向工具