PoC检测器与安全验证器,针对WP2Shell WordPress漏洞链:CVE-2026-63030(REST批处理路由混淆)+ CVE-2026-60137(author__not_in SQL注入)。仅限授权的安全测试使用。
CVE 覆盖范围: CVE-2026-63030 和 CVE-2026-60137 预期用途: 仅限授权的安全测试、防御性验证和一次性本地主机实验室
WP2Shell 是一个 WordPress 核心漏洞链,结合了预认证 REST API 批处理路由混淆漏洞(CVE-2026-63030)和一个 WP_Query author__not_in SQL 注入原语(CVE-2026-60137)。该仓库提供了一个 Python 概念验证扫描器和安全验证器,使防御者能够指纹识别受影响的 WordPress 安装,在隔离实验室中确认易受攻击的行为,并验证修复措施——无需提取数据或实现代码执行。
该项目对 WordPress 安装进行指纹识别,并验证与 WP2Shell WordPress 核心漏洞链相关的两个漏洞原语:
WP_Query::author__not_in 的不完全清理,当攻击者控制的输入到达该参数时可能导致 SQL 注入。当两个条件同时存在时,未经身份验证的请求可能通过 WordPress REST API 批处理端点到达易受攻击的 SQL 构造。公共公告将组合影响描述为可能导致远程代码执行。
该仓库应仅用于您拥有或明确授权测试的系统。建议使用绑定到 127.0.0.1 的隔离 Docker 或虚拟机实验室。
当前源文件包含状态更改功能,包括数据库数据提取尝试、文件写入尝试、身份验证工作流、管理员创建、插件上传和命令执行。
受影响的 WordPress 版本会丢失用于跟踪的内部数组之间的对齐:
当一个格式错误的批处理成员被接受到一个内部数组但未被接受到另一个内部数组时,后续请求可能与错误的处理器关联。因此,一个请求可能被验证为一条路由,但使用另一条路由的回调执行。
安全影响:
author__not_in SQL 注入受影响的 WP_Query 实现在使用 author__not_in 构造 SQL NOT IN (...) 条件之前,未一致地对其进行规范化。
该参数通常期望一个整数作者 ID 列表。如果标量字符串在未经过预期的 REST 模式验证的情况下到达易受攻击的查询构造,则不安全的 SQL 结构可能存活到数据库查询中。
安全影响:
| 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`:```text
/?rest_route=/
/wp-json/
该路由可以通过以下任一方式访问:```text /?rest_route=/batch/v1 /wp-json/batch/v1
### 阶段5 — 安全路由混淆探测
安全探测包含:
1. 一个故意格式错误的内部路径。
2. 一个对无效帖子ID的请求,带有一个无害的嵌套公共`GET`。
3. 一个后续的`/batch/v1`请求。
易受攻击的服务器返回一个外层的`207 Multi-Status`响应,其中无效的帖子请求被处理为嵌套批量请求。
检测器报告:```text
route-confusion-observed
当检测到:
parse_path_failed 标记。207。responses 数组显示出无害的内部请求已执行。非破坏性的SQL注入验证器应发送成对请求,这些请求仅在一个常量布尔条件上有所差异:```text False control -> no deliberate database delay True test -> deliberate database delay
验证器必须:
- 接受预期的外层 HTTP `207`。
- 解析外层和嵌套的批量信封。
- 验证格式错误的请求标记。
- 确保携带 SQLi 的嵌套请求返回了有效响应。
- 收集多个真样本和假样本。
- 随机化或交错样本顺序。
- 比较中位数而非单个请求。
- 将测量不足的情况报告为 `inconclusive`。
真假样本之间可重复出现的差距,确认攻击者控制的输入到达了 SQL 评估。无需选择或提取任何数据库内容。
---
## 要求
- Python 3.9 或更高版本。
- 所提供的脚本不需要第三方 Python 包。
- 能够访问授权的 WordPress 安装的网络权限。
- 对于本地测试:
- 一个可丢弃的 WordPress 7.0.1 或 6.9.4 实验环境。
- 一个数据库容器或专用的测试数据库。
- 绑定到 `127.0.0.1` 的 web 服务。
- 没有生产环境的凭据或数据。
检查 Python:```bash
python3 --version
可选语法验证:```bash python3 -m py_compile WP2Shell_CVE-2026-63030_POC.py
---
## 安装
将提供的脚本重命名为一个可预测的文件名:```bash
mv 'poc(1).py' WP2Shell_CVE-2026-63030_POC.py
chmod +x WP2Shell_CVE-2026-63030_POC.py
显示全局帮助:```bash python3 WP2Shell_CVE-2026-63030_POC.py --help
显示版本:```bash
python3 WP2Shell_CVE-2026-63030_POC.py --version
该脚本定义了三个命令:```text 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` 输出以下内容:```text
Remote scanning not fully implemented in this snippet. Use 'local' or 'exploit'.
在宣传批量远程扫描功能之前,先恢复完整的 run_remote() 实现。
local 命令内容如下:```text
/wp-includes/version.php
并提取 `$wp_version`。
## 基本用法```bash
python3 WP2Shell_CVE-2026-63030_POC.py local \
--wordpress-root /var/www/html
python3 WP2Shell_CVE-2026-63030_POC.py local
--wordpress-root /var/www/html
--format json
--output local-result.json
## 基于 Docker 的 WordPress 安装
当 WordPress 容器名为 `wordpress` 时,将源代码树复制或挂载到主机上,或在容器内运行版本检查:```bash
docker compose exec wordpress php -r \
'require "/var/www/html/wp-includes/version.php"; echo $wp_version, PHP_EOL;'
使用提供的 compose.yaml 运行一个绑定到 127.0.0.1:8080 的一次性本地实验室:```bash
docker compose up -d
一旦在浏览器中完成WordPress的首次设置(地址为 `http://127.0.0.1:8080`),你可以运行:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target http://127.0.0.1:8080 \
--active-probe \
--format json
停止并移除实验室:```bash 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` |
## 示例:漏洞版本输出```json
[
{
"selected_version": "7.0.1",
"version_assessment": "affected-wp2shell",
"verdict": "CONFIRMED_AFFECTED_VERSION",
"severity": "critical"
}
]
本地版本结果确认已安装的版本在已公布的受影响范围内。但它本身并不证明运行时可利用性或向后移植补丁的效果。
remote 解析器支持以下参数,但提供的 run_remote() 实现目前不完整。
恢复 run_remote() 后的预期接口:```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote
--authorized
--target https://wordpress.example
--active-probe
## 多个显式目标```bash
python3 WP2Shell_CVE-2026-63030_POC.py remote \
--authorized \
--target https://site-one.example \
--target https://site-two.example \
--active-probe