tcyph3r/wp2shell-cve-2026-63030-root-cause
GitHub: tcyph3r/wp2shell-cve-2026-63030-root-cause
该项目对影响 WordPress 核心的 wp2shell 未授权 RCE 漏洞链进行了基于源码 diff 和本地复现的独立根因分析。
Stars: 0 | Forks: 0
# wp2shell (CVE-2026-63030 + CVE-2026-60137):独立根因分析
WordPress 核心团队于 2026-07-17 披露了 wp2shell,这是一个影响默认安装的严重未授权
RCE(影响 WordPress 6.9.0-6.9.4、7.0.0-7.0.1,无需
任何插件)。原始发现者(Searchlight Cyber)在披露时
暂未公布技术细节。本仓库记录了一项独立的
根因分析,该分析完全基于对 WordPress 核心源码在存在漏洞的版本(6.9.4)和已修复版本(6.9.5)之间进行的 diff,以及在本地实验室环境中的
实际验证。
致谢:此处的复现遵循了
[sergiointel/wp2shell-poc](https://github.com/sergiointel/wp2shell-poc) 的请求结构,
并经过逐字节的确认,同时与真实的补丁 diff 进行了交叉验证。
## 目录
- `root_cause_analysis.md` - 完整的分析文章:包括两个链式漏洞、确切的
易受攻击代码、补丁 diff、漏洞利用链,以及针对真实 WP 6.9.4 实例在打补丁前后的实际验证。
- `poc_upstream.py` - sergiointel 原始 PoC 的未修改副本。
- `poc_extract.py` / `poc_extract2.py` - 经过调整的变体(更大的 `SLEEP()`、
更高的时间阈值、更长的字符搜索上限),在 Docker/代理实验室环境中,由于上游脚本的
默认 `SLEEP(0.15)` 被网络抖动淹没,需要此变体才能
获得可靠的信号。
- `docker-compose.yml` - 启动用于
验证的相同 WordPress 6.9.4 + MariaDB 实验室环境。
- `payload.json`、`response.json`、`response_patched.json` - 一个手工构造的
请求(复制了 PoC 的结构)以及原始服务器响应,
包含在原位应用 6.9.5 补丁文件之前和之后的响应。
## 调查结果摘要
**CVE-2026-63030(REST 批量路由混淆,CWE-436):**
`WP_REST_Server::serve_batch_request_v1()` 通过简单的推送操作向 `$matches[]` 数组中
追加内容,但是当子请求的路径解析失败时(
例如故意构造的格式错误的 `"http://:"` 条目),它会跳过追加操作。这一单独的跳过
会导致 `$matches[]` 与 `$requests[]` 之间产生一个索引的错位,影响
后续的所有条目。在调度时,`$matches[$i]` 不再对应于
`$requests[$i]`,因此代码最终会在一个与其实际验证的
处理程序 *不同* 的路由的匹配处理程序下执行请求数据。
**CVE-2026-60137(SQL 注入):** `WP_Query::get_posts()` 仅在 `is_array()` 分支内
对 `author__not_in` 执行了 `absint()` 清理操作。如果传入的是
标量字符串值,则会完全跳过清理,并
直接拼接到 `... post_author NOT IN ($value)` 中。
**漏洞链:** 路由混淆漏洞允许攻击者将一个声明为针对
`/wp/v2/categories`(该路由不识别 `author_exclude`,因此永远不会对其进行清理)的请求,实际通过 **posts** 控制器(该控制器确实会读取 `author_exclude` 并将其转发给 `WP_Query`)进行调度。无需身份验证。
**关于 RCE 声明:** 经过实际验证,未授权的盲注 SQL 注入
确实有效,并且可以泄露任意数据库内容,包括
`wp_users.user_pass`。已确认,在虚拟化实验室中进行单次基于时间的提取过程
会产生明显的比特误差噪声(在此处的测试中,每字符准确率约为 94%),并且该技术的最后一步,即将提取出的
bcrypt 哈希转换为可用的管理员凭据,完全取决于目标的
密码强度,而不是漏洞本身。RCE 是此漏洞的
一个现实后果,而非一个必然、自动发生的结果。
## 复现
```
docker compose up -d
# 等待 :8890 上的 WordPress install wizard 可访问,然后完成 setup
HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://127.0.0.1:8080 \
python3 poc_extract2.py http://localhost:8890 "SELECT DATABASE()"
```
有关完整的技术分析文章,请参阅 `root_cause_analysis.md`。
## 负责任的漏洞披露
WordPress 已发布了官方修复程序:6.9.5 和 7.0.2(
beta 分支为 7.1 Beta 2),于 2026-07-17 发布。如果您运行的是受影响的
版本,请立即更新。本仓库是在
补丁已经公开之后,出于防御和教育目的而发布的。请仅在针对您拥有或获得明确授权进行测试的
系统上运行此处的任何代码。
标签:CISA项目, Web安全, WordPress, 多线程, 文件完整性监控, 漏洞分析, 漏洞复现, 版权保护, 编程工具, 蓝队分析, 请求拦截, 路径探测, 远程代码执行, 逆向工具