
PoC autenticado para CVE-2026-0911: prueba la carga de archivos débil y el comportamiento de archivos huérfanos en el endpoint de importación de módulos del plugin Hustle de WordPress, con escaneo multi-objetivo y personalización de payloads.
Herramienta de investigación / asistente de pentest que prueba el comportamiento de carga a través del endpoint de importación de módulos que requiere autenticación, en el marco de CVE-2026-0911 para el plugin de WordPress Hustle (wordpress-popup, WPMU DEV).
El script CVE-2026-0911.py dentro de este repositorio o conjunto de archivos debe utilizarse únicamente en sistemas que usted posea o que tenga autorización por escrito para probar.
En las versiones afectadas (Wordfence/NVD: 7.8.9.2 y anteriores), la llamada a wp_handle_upload() dentro de action_import_module() se realiza con test_type => false, por lo que la validación del tipo de archivo es débil; incluso si la validación JSON posterior a la importación falla, el archivo cargado (archivo "huérfano"). Si el servidor ejecuta PHP en , esto puede ser parte de una cadena que en la práctica conduce a la ejecución remota de código. En las versiones parcheadas se introduce y una restricción con temporal.
wp-content/uploadstest_type => true.jsonupload_mimesConsulte el registro de NVD y las referencias de Wordfence para obtener un resumen técnico detallado.
from __future__ import annotations)Ejemplo de instalación:
pip install requests
Se requiere al menos un objetivo (-u o -l) y una sesión válida de WordPress (--cookie o --cookie-file).
python CVE-2026-0911.py -u "https://ejemplo.com" --cookie "wordpress_logged_in_...=...; ..."
Ayuda:
python CVE-2026-0911.py --help
| Parámetro | Descripción |
|---|---|
-u, --url | URL raíz de un único objetivo (p. ej. https://sitio.com) |
-l, --list | Archivo con una URL por línea (comentarios con #) |
--cookie | Cadena de cookies copiada del navegador |
--cookie-file | Archivo que contiene la cookie en una sola línea |
--nonce | Nonce de WordPress manual para hustle_single_action (en lugar de la obtención automática) |
--admin-page | Valor de admin.php?page= del que se extraerá el nonce (predeterminado: hustle_popup_listing) |
--module-id | moduleId del POST (predeterminado 0: módulo no válido → flujo de importación) |
--module-type | popup, slidein, embedded, social_sharing |
--module-mode | P. ej. informational, optin |
--remote-name | Nombre de archivo enviado en el multipart (predeterminado: probe_rce.php) |
--payload-file | Leer el contenido a cargar desde un archivo (anula --uploader y la sonda predeterminada) |
--uploader | Usar el cuerpo del mini formulario PHP uploader integrado |
--workers | Número de hilos simultáneos en modo lista (predeterminado: 8) |
--timeout | Tiempo de espera de la solicitud en segundos (predeterminado: 25) |
--verify-ssl | Activar la verificación TLS (predeterminado: desactivada) |
--debug |
admin-ajax.php, posibles URL candidatas. En objetivos múltiples, las líneas pueden aparecer entremezcladas porque provienen de hilos; cada línea incluye el nombre de dominio del objetivo.--quiet estos detalles se silencian.append) inmediatamente al archivo -o y se escriben en disco con flush / fsync cuando es posible. Nombre de archivo predeterminado: cve-2026-0911-hits.txt (se resume la ruta absoluta en el directorio de trabajo).Sitio único, verificación TLS, depuración:
python CVE-2026-0911.py -u "https://lab.local" --cookie-file cookie.txt --verify-ssl --debug
Escaneo de lista, 16 trabajadores, salida personalizada:
python CVE-2026-0911.py -l objetivos.txt --cookie "..." --workers 16 -o resultados.txt
Cuerpo del uploader integrado y nombre de archivo remoto personalizado:
python CVE-2026-0911.py -u "https://lab.local" --cookie "..." --uploader --remote-name test.php
single_module_action_nonce dentro de optinVars.moduleId=0, el plugin puede devolver un error debido al límite de módulos antes de la carga; en ese caso, el archivo no se escribe.wp-content/uploads/YYYY/MM/; si WordPress renombra el archivo, la ruta real puede diferir.--cookie no funciona en dominios diferentes; en pruebas de múltiples sitios se requiere una sesión adecuada para cada entorno.0; de lo contrario, un código distinto de 0 (retorno de main dentro del script).Ctrl+C: 130.Esta herramienta es únicamente para pruebas de seguridad legales, educación y uso defensivo. Su uso en sistemas no autorizados es ilegal y puede acarrear sanciones graves. Los autores y colaboradores no se hacen responsables del mal uso.
| Salida de depuración adicional |
--quiet | Desactivar los registros de dominio/pasos; centrado en el resumen |
-o, --output | Archivo al que se añaden las líneas de "aciertos" exitosos |