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 于 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
创建 targets.txt:```text
https://site-one.example/
https://site-two.example/blog/
预期接口:```bash
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
## 代理使用```bash
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'
## Remote options
| Option | 用途 |
|---|---|
| `-u, --target URL` | 目标 URL;可重复 |
| `-l, --targets-file FILE` | 每行一个目标;可重复 |
| `--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` | 覆盖用户代理 |
| `--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` | 退出码策略 |
---
# 安全运行时验证
对于两个原语的非破坏性本地验证,请使用专用验证器,该验证器:
- 拒绝非回环主机。
- 首先确认路由混淆。
- 仅在路由混淆成功后运行常量条件时序样本。
- 不提取数据或执行命令。
示例工作流程:```bash
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
预期的易受攻击的实验室时间模式:```text False controls: approximately 0.03–0.10 seconds True tests: consistently delayed
预期判决:```text
FULL_VULNERABILITY_PRIMITIVES_CONFIRMED
时序测试可以多次执行延迟表达式,因此配置为两秒的延迟可能会产生接近四秒的观测延迟。重要的信号是真假条件之间的可重复间隔。
最适合交互式终端使用:```bash --format table
### JSON
最适合用于证据收集和集成:```bash
--format json --output result.json
适用于大规模目标集:```bash --format jsonl --output results.jsonl
### CSV
最适合电子表格和报告:```bash
--format csv --output results.csv
扫描器使用策略驱动的退出代码。
| 代码 |
|---|
因此,漏洞发现可以有意识地返回非零状态。
示例:```bash
python3 WP2Shell_CVE-2026-63030_POC.py local
--wordpress-root /var/www/html
--fail-on vulnerable
echo $?
---
## 易受攻击版本与已修复版本的差异测试
一种强验证方法是比较两个干净的环境。
### 易受攻击环境```text
WordPress 7.0.1
预期:```text route-confusion-observed repeatable true/false SQL timing difference
### 固定环境```text
WordPress 7.0.2
预期:```text route-confusion-not-observed SQLi timing test not reached or no valid timing oracle
在更改版本时,务必重新创建 WordPress 卷。重用卷可能会保留旧的或自动更新的核心文件。```bash
docker compose down -v
docker compose pull
docker compose up -d
立即更新至已修复的版本或后续受支持的版本:
临时控制措施应涵盖两种批量端点形式:```text /wp-json/batch/v1 /?rest_route=/batch/v1
其他防御措施:
1. 检查日志中是否有匿名批量请求、格式错误的内部URL、嵌套的批量结构以及异常的`author_exclude`值。
2. 在经历任何暴露期后,审查管理员账户、插件变更、意外的PHP文件以及数据库访问。
3. 验证WordPress核心校验和,若怀疑被入侵则从已知的良好备份恢复。
4. 当可能存在SQL注入利用时,轮换存储在WordPress数据库中的密钥和凭证。
阻断端点只是临时缓解措施,不能替代更新WordPress核心。
---
## 检测思路
潜在指标包括:
- 对任一批量端点表单的匿名`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安装暴露于公共互联网。使用一次性凭证、合成数据、隔离网络和干净的快照。测试后销毁或重置实验室。
最安全的漏洞证明方式是提供证明问题所需的最低限度证据。```text
Affected version
+
Route-confusion behavior
+
Repeatable constant-condition SQL timing oracle
凭证窃取、持久化、Webshell安装和命令执行对于确认漏洞存在而言是不必要的。
| 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 |
| 裁定结果 | 含义 |
|---|
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 | 参数、输入或不完整命令错误 |