CVE-2026-64638 — 通用横幅 PoC
一个单文件、无依赖的 PoC 生成器,针对 WordPress CVE-2026-64638
在 wp-login.php 上的反射型 HTML 注入(strip_tags() 与 KSES 解析器
差异)。它生成一个自动提交的触发页面:当受害者打开该文件时,页面会静默 POST 注入载荷,
受害者将直接落在目标登录页面上并渲染出横幅——无需交互,目标端无需 JavaScript。
仅限授权的安全测试。 仅可针对您拥有或明确获授权测试的系统使用。
受影响版本(经验证)
| 版本 | 状态 |
|---|
| 6.4.0 – 7.0.2 | 存在漏洞——开箱即触发 |
| 5.8 – 6.3 | 有条件——需要插件通过 wp_kses() 传递 login_errors 且允许 style |
| 4.7 – 5.7 | 不可利用(用户名未被反射) |
| 6.4.9 / 6.5.9 / 6.6.6 / 6.7.6+ / 6.8.7 / 6.9.6 / 7.0.3+ | 已修复(esc_html) |
使用方法
python3 banner_poc.py \
--out trigger.html \
--target http://192.0.2.10/wp-login.php \
--msg "Scheduled System Maintenance"
# 子目录 + 隐藏登录路径 + 副标题
python3 banner_poc.py \
--out trigger.html \
--target http://10.0.0.5:8080/blog/my-secret-login \
--msg "Please sign in again" --sub "Session expired"
将 trigger.html 托管在任何位置。当受害者打开它时,会被重定向到
目标登录页面并渲染出横幅。跳转过程静默无感:无可见的中间内容,
背景与 WordPress 登录界面一致,约 0.5 秒内完成落地。
工作原理
wp-login.php 将登录失败的用户名反射到错误消息中。
存在漏洞的版本使用 PHP strip_tags() 进行清理,该函数会放过
任何 < 后跟空白字符的内容。
- 反射文本随后被 KSES 重新解析,将其重建为
实时 HTML——因此
< div style="..."> 会以真实元素形式呈现。
< /strong>(斜杠前带空格)同样能绕过 strip_tags(),并被
重建为真实的闭合标签,使载荷能够闭合模板中的
<strong>(一个 HTML5 活动格式化元素)作为其第一个标记,并
保持对 DOM 的精确控制。
- 末尾一个未闭合的零尺寸屏幕外
div 会吞掉模板的尾部文本
("… is not registered on this site …")。
- 横幅使用无
class 的内联样式,能够通过
safecss_filter_attr() 的过滤。在 6.3+ / 6.4+ 上,position:fixed 会渲染全页
覆盖层;在 5.8–6.2 上,这些属性会被剥离,同一载荷
会自动降级为流内红色横幅。
纯 HTML/CSS——目标端不执行任何 JavaScript。针对
<script> 或事件处理程序的 WAF 规则不适用。
免责声明
本工具发布用于防御性研究和授权渗透测试。
作者不对滥用行为负责。