WordPress 核心于 2026-07-17 披露了 wp2shell,这是一个影响默认安装(WordPress 6.9.0-6.9.4, 7.0.0-7.0.1,无需任何插件)的严重未认证 RCE。原始发现者(Searchlight Cyber)在披露时未公开技术细节。本仓库记录了一次完全基于对 WordPress 核心源码在受影响版本(6.9.4)与修复版本(6.9.5)之间进行差异分析,以及在本地实验室中实时验证得出的独立根因分析。
致谢:本文的复现遵循 sergiointel/wp2shell-poc 中的请求结构,逐字节确认并与真实补丁差异交叉核对。
root_cause_analysis.md - 完整技术报告:两个链式漏洞、确切脆弱代码、补丁差异、利用链,以及在真实 WP 6.9.4 实例上的修复前后实时验证。poc_upstream.py - sergiointel 原始 PoC(仅 SQLi)的未修改副本。poc_upstream_rce.py - sergiointel 的 PoC 在披露后约 22 小时更新版本,增加了未认证权限提升和无需破解任何凭据的远程代码执行(RCE)。参见 root_cause_analysis.md 第 7 节。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 补丁文件前后的原始服务端响应。另一个独立编写的 PoC(github.com/Icex0/wp2shell-poc)已全文审阅,并独立描述了相同的根因机制,印证了以下分析。通过其基于内容(布尔型,而非时序型)的盲 SQL 注入提取,该实验室的管理员凭据哈希以 100% 准确率被恢复;并且利用该已知凭据,完整演示了从 SQL 注入到远程代码执行的实时链:SQL 注入 → 凭据提取 → 认证插件上传 Webshell → 以 www-data 用户执行代码。参见 root_cause_analysis.md 第 6 节。
该凭据破解路径是有效的,但并非唯一路径。sergiointel 的 PoC 随后被更新,无需任何凭据破解即可实现未认证 RCE:其利用 UNION SELECT 伪造数据库行,WordPress 自己的 Customizer/nav-menu/oEmbed-cache 代码对这些行足够信任,从而允许未认证的用户创建请求成功。参见 root_cause_analysis.md 第 7 节。在默认安装上,仅凭未认证的 SQL 注入就足以实现完全 RCE。
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,因此从未被清理)的请求实际通过文章控制器来分发(该控制器确实读取 author_exclude 并将其转发到 WP_Query)。无需任何认证。
关于 RCE 声明的说明: 已在实时环境中确认未认证的盲 SQL 注入有效,可以窃取任意数据库内容,包括 wp_users.user_pass。在虚拟化实验室中,一次基于时序的提取过程存在可观的比特错误噪声(此处测试中字符级准确率约为 94%);基于内容(布尔型)的预言机制没有出现该故障模式,能以 100% 准确率恢复相同字段。RCE 通过两条不同路径确认:破解已恢复的密码哈希(取决于密码强度),以及使用由 WordPress 自己的 Customizer/nav-menu/oEmbed-cache 代码信任的 UNION 伪造数据库行的未认证权限提升小工具链(无条件,无需凭据失陷)。参见 root_cause_analysis.md 第 7 节。
docker compose up -d
# 等待 WordPress 安装向导在 :8890 可访问,然后完成设置
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(测试分支为 7.1 Beta 2),于 2026-07-17 发布。如果你运行受影响版本,请立即更新。本仓库在补丁已公开后发布,仅用于防御和教育目的。仅在你拥有或明确授权测试的系统上运行此处的任何代码。