
CVE复现:cve-2026-63030_60137-wordpress_rce_reproduction
| CVE | 组件 | 类型 | CWE |
|---|
| CVE-2026-63030 | WP REST API 批量端点 | 路由混淆 / 访问控制绕过 | CWE-436 |
| CVE-2026-60137 | WP_Query 的 author__not_in 参数 | SQL 注入 | CWE-89 |
每个漏洞单独来看都很严重;组合使用则允许未认证攻击者在目标上执行任意 PHP 并部署 webshell。
WordPress REST API 在 /wp-json/wp/v2/batch 暴露了一个批量端点。由于路由解析中的缺陷(在 WP 6.9 重写的路由中间件中引入),批量处理器未正确验证批量中的内部子请求是否继承了外部请求的身份验证和权限检查。攻击者可以构造一个批量载荷,从而:
wp/v2/users、wp/v2/plugins)。WP_REST_Server::dispatch() 将伪造的路由参数传递给内部处理程序。这绕过了所有针对读取操作的认证保护,并且结合参数走私时,还能绕过部分写入操作。
author__not_in SQL 注入WP_Query 类接受一个 author__not_in 参数,用于排除特定作者 ID 的文章。WP_Query::get_posts() 方法中的类型强制转换错误(在 WP 6.9 的查询清理重构中引入)导致,当以特殊构造的关联数组提供时,author__not_in 的值会被直接插入到 SQL WHERE 子句中,而未进行适当的参数化。
注入发生在生成的 SQL 的 post_author IN (...) 部分。通过嵌套包含原始 SQL 片段的数组,攻击者可以跳出 IN 子句并执行任意的 UNION / INTO OUTFILE 语句 —— 前提是数据库用户具有 FILE 权限。
攻击者(未认证)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: 绕过身份验证,调用内部查询 API
│ └─ CVE-2026-60137: 通过 author__not_in 注入 SQL
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell 部署到 Web 根目录
│ └─ 实现 RCE
批量端点提供了攻击向量;SQL 注入提供了载荷投递。
| 版本范围 | 完整链 |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ 两个 CVE 均存在 |
| WordPress 7.0.0 – 7.0.1 | ✅ 两个 CVE 均存在 |
| WordPress ≤ 6.8.x | 仅存在 CVE-2026-63030(SQL 注入无法利用) |
补丁已在 WordPress 6.9.5 和 7.0.2 中发布(均于 2026-07-16 发布)。
/wp-json/wp/v2/batch 返回 200(而非 403/404)。--target 标志运行 PoC(见下文)。/wp-content/webshell.php?cmd=id 确认 webshell。python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch。FILE 权限。define('DISALLOW_FILE_EDIT', true); 和 define('DISALLOW_FILE_MODS', true);。wp-content/ 下意外的 .php 文件。author__not_in 是否有非整数值。