WordPress 在 2026 年 8 月 6 日发布的安全版本 7.0.3 中修复了一处位于登录页面的预认证反射型跨站脚本漏洞。该漏洞编号为 CVE-2026-64638,CVSS v3.1 评分 8.9,由 pwn.ai 团队发现并以「XSS2Shell」链形式公开演示其从 XSS 一路贯通到 PHP 代码执行的全过程。该漏洞影响所有 WordPress 版本,安全补丁已反向移植至 4.7 分支,但仍要求所有未启用自动后台更新的站点立即手动升级。
事件概述
CVE-2026-64638 触发于 WordPress 登录失败时回显用户名失败信息的错误页面。漏洞成因是 WordPress 在将用户提交的失败用户名回显到页面时,先经过 sanitize_user() 与 wp_strip_all_tags() 处理,但这两个函数依赖 PHP 的 strip_tags(),无法移除形如 < img src=x > 这种在尖括号后带有空白字符的伪标签字符串。随后内容又被 wp_kses_post() 重新解析为合法 HTML,让攻击者控制的 DOM 元素成功进入失败登录页。同源方法执行(SOME)+ JSONP 反射链 + Application Password 申请权限串联,最终允许攻击者在管理员点击一次恶意链接的情况下上传 WebShell 并以 PHP 执行任意代码。
技术细节
- 反射注入点:登录错误页面
wp-login.php?error=与失败用户名回显路径。 - 绕过双解析:第一轮
strip_tags漏掉空白字符引入的伪造 HTML 节点;第二轮wp_kses_post又将其重新解释为合法 HTML,造成 DOM 注入。 - 同源函数调用:攻击者通过
ajaxurl变量覆盖、缺失输入导致的undefined比较绕过,操控 WordPress 的user-profile.js发送同源 REST 请求。 - JSONP 反射:即使匿名 REST 请求返回 401,REST 的
_envelope=1参数将错误体包裹成 HTTP 200 响应,jQuery 继续按脚本解析。 - 会话升级:使用 SOME 链在另一个窗口调用登录管理者的原生 Application Password 审批控件,生成可撤销 API 凭据,再以该凭据发布新页面以获取插件上传 nonce,最后上传任意 ZIP 而无需激活,直接
require提取出的 PHP 即触发代码执行。 - CSP 失效:研究者指出,基于 nonce 的
strict-dynamic策略并不能阻断上述攻击链。
影响评估
- CVSS 3.1 评分:8.9(High),向量
AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L。 - 利用前提:未认证远程攻击者发起定向钓鱼,已登录管理员点击一次恶意链接,便可在受害浏览器上下文获得会话权限并最终执行 PHP。
- 实际危害:获取
wp-config.php中的数据库口令、新建管理员账号、上传任意 PHP WebShell,最终对运行 WordPress 的主机实现远程命令执行;该路径不依赖盗取管理员主口令。 - 影响面:所有未升级至 7.0.3(且不在已反向移植的 4.7+ 分支)的 WordPress 站点,全球范围内数以亿计的博客、企业站、商城、媒体门户均受影响。
修复建议
- 立即升级:将 WordPress 核心升级至 7.0.3,若仍处于旧分支,确保处于反向移植覆盖范围内(≥4.7)。
- 临时缓解:在反代层封禁
wp-login.php对不可疑客户端的 URL 参数注入;启用基于Origin/Referer校验的 WAF 规则,拦截<、空白字符组合的载荷。 - 会话审计:检查
wp_users中是否存在不明管理员账号;核对 Application Password 列表,撤销未授权凭据;复核wp-content/plugins与uploads目录中新出现的可疑 ZIP 与 PHP。 - 检测规则:监控失败登录错误页面对应的访问日志,识别是否存在异常
User-Agent、异常 IP 来源的失败回包。