Wordpress wp2shell 未授权RCE(CVE-2026-63030 / CVE-2026-60137)

💡 原文中文,约8400字,阅读约需20分钟。
📝

内容提要

WordPress 6.9至7.0.1版本存在严重RCE漏洞,由三个漏洞组合利用:REST API批量请求路由混淆(CVE-2026-63030)绕过参数检查,WP_Query的author__not_in参数SQL注入(CVE-2026-60137)污染缓存,再通过oEmbed持久化及Customizer权限切换,最终以管理员身份创建账户并安装恶意插件实现远程代码执行。该漏洞利用巧妙,已获修复。

🔎

延伸解读

漏洞组合的巧妙之处

该漏洞并非单一漏洞,而是由三个漏洞组合而成:REST API路由混淆、SQL注入和REST重入。其中,路由混淆本身危害不大,但作为入口绕过了参数检查;SQL注入虽无法直接提权,但通过控制查询结果污染缓存;最终利用Customizer的权限切换和REST重入实现管理员权限。这种层层递进的利用思路,展示了漏洞组合的威力。

利用条件与限制

利用该漏洞需要满足多个条件:目标WordPress版本在6.9.0至7.0.1之间,且必须启用REST API和oEmbed功能(默认开启)。攻击者无需认证,但需要能够发送构造的批量请求。此外,利用过程依赖WP_Query的author__not_in参数处理缺陷,以及Customizer的权限切换机制,这些在默认配置下均可用。

修复建议与防护措施

官方已在7.0.2版本中修复该漏洞,主要修复了三个问题:路由混淆、SQL注入和REST重入。建议用户立即升级至最新版本。若无法升级,可暂时禁用REST API或限制批量请求,但可能影响正常功能。同时,关注官方安全公告,及时应用补丁。

Q&A

WordPress 6.9至7.0.1版本存在哪些严重漏洞?

存在两个CVE漏洞:CVE-2026-63030(REST API批量请求路由混淆)和CVE-2026-60137(WP_Query的author__not_in参数SQL注入),以及一个未分配CVE的REST重入漏洞,三者组合可实现未授权远程代码执行。

CVE-2026-63030漏洞的原理是什么?

该漏洞位于WP_REST_Server::serve_batch_request_v1()处理批量请求时,内部维护$validation和$matches两个数组。当某个子请求验证失败时,错误被推入$validation但未向$matches推入对应条目,导致两个数组索引偏移。攻击者可利用此偏移,使后续请求的参数匹配到之前的请求,从而绕过参数检查和过滤。

CVE-2026-60137 SQL注入漏洞是如何触发的?

WP_Query的author__not_in参数如果为数组,会使用absint()消毒;但如果为字符串,则直接拼接到SQL语句中。由于REST API的schema要求该参数为数组,正常情况下无法传入字符串,但结合CVE-2026-63030绕过参数类型检查后,即可传入字符串触发SQL注入。

WordPress缓存污染在漏洞利用中起什么作用?

通过SQL注入控制数据库查询结果,将恶意数据作为WP_Post对象写入内存缓存。随后利用oEmbed的缓存刷新机制,通过wp_update_post()将污染数据持久化到数据库,为后续利用创造条件。

REST重入漏洞是如何实现管理员权限提升的?

Customizer在保存设置时临时将当前用户切换为changeset的原始创建者,如果changeset由管理员创建,则当前请求获得管理员身份。此时触发parse_request hook,再次发起REST请求,由于WP_REST_Server::is_dispatching()未阻断重入,嵌套的REST dispatch继承了管理员身份,从而可以执行管理员操作,如创建管理员账户。

攻击者最终如何实现远程代码执行?

攻击者利用上述漏洞链,以管理员身份调用创建用户API创建新管理员账户,然后登录该账户,上传包含PHP webshell的恶意插件,从而在服务器上执行任意代码。

WordPress 7.0.2版本是如何修复这个漏洞链的?

在7.0.2中,当dispatch激活时,加载器会提前返回,阻止REST重入递归,从而阻断漏洞利用链。

🏷️

标签

➡️

继续阅读