CVE-2026-64638:WordPress 7.0.3 登录页预认证 XSS2Shell 漏洞,管理员一键被攻陷

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/pluginsuploads 目录中新出现的可疑 ZIP 与 PHP。
  • 检测规则:监控失败登录错误页面对应的访问日志,识别是否存在异常 User-Agent、异常 IP 来源的失败回包。

参考来源