Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-32475 — Prova de conceito de exploit para CVE-2026-32475, um upload arbitrário de arquivos não autenticado no Elementor Pro que leva à execução remota de código. Inclui descoberta automatizada, upload e execução de comandos com limpeza. | Kitploit
Ferramentas/GitHubGitHub/sahmsec/cve-2026-32475
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoRed Teaming
GitHubsahmsec/cve-2026-32475

CVE-2026-32475

Prova de conceito de exploit para CVE-2026-32475, um upload arbitrário de arquivos não autenticado no Elementor Pro que leva à execução remota de código. Inclui descoberta automatizada, upload e execução de comandos com limpeza.

Ver Repositório
120há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-32475 — Elementor Pro ≤ 4.2.1 Upload Arbitrário de Arquivo Não Autenticado → RCE

PoC para CVE-2026-32475 (CVSS 9.0 Crítico, CWE-434): um upload arbitrário de arquivo não autenticado no módulo de Formulários do Elementor Pro que leva à execução remota de código. Corrigido no Elementor Pro 4.2.2 (19/08/2026). Reportado por Tin Pham (TF1T) por meio do programa de Bug Bounty da Patchstack.

  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ Aviso legal

Esta prova de conceito é fornecida apenas para pesquisa de segurança autorizada, educação e testes defensivos.

  • Você deve possuir o sistema alvo ou ter permissão explícita por escrito do proprietário do sistema antes de executar esta ferramenta contra ele.
  • O acesso não autorizado a sistemas de computador é ilegal na maioria das jurisdições (por exemplo, o Computer Fraud and Abuse Act nos EUA, o Computer Misuse Act no Reino Unido e leis semelhantes em todo o mundo) e pode acarretar penalidades criminais e civis.
  • Os autores e colaboradores não assumem nenhuma responsabilidade por qualquer uso indevido, dano ou consequência legal decorrente do uso deste código.
  • Ao usar este software, você concorda em usá-lo de forma responsável e em conformidade com todas as leis aplicáveis.

O que é a vulnerabilidade

O campo de Upload de Arquivo dos formulários do Elementor Pro processa as entradas enviadas em dois loops separados com semânticas diferentes (modules/forms/fields/upload.php):

// validation()
foreach ( $files[$id] as $index => $file ) {
    if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
        return;                    // <-- aborta TODO o método
    }
    // is_file_type_valid() ...    // nunca é alcançado para a entrada #2
}

// process_field()
foreach ( $files[$id] as $index => $file ) {
    if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
        continue;                  // <-- pula apenas ESTA entrada
    }
    $filename = uniqid() . '.' . $file_extension;   // extensão controlada pelo atacante
    move_uploaded_file( $file['tmp_name'], $new_file );
}

Enviar duas partes de arquivo para o mesmo campo de upload — uma primeira parte vazia (filename="" → UPLOAD_ERR_NO_FILE) seguida pelo payload .php — faz com que validation() retorne antes que a lista de bloqueio de extensões veja o payload, enquanto process_field() ainda o move para wp-content/uploads/elementor/forms/<uniqid()>.php, um diretório web público. Solicitar essa URL diretamente = execução remota de código.

O upload é tratado por POST /wp-admin/admin-ajax.php (action=elementor_pro_forms_send_form) sem autenticação e sem nonce. O post_id, form_id e o nome do campo de upload são visíveis no HTML da página pública, portanto todo o ataque é não autenticado.

Requisitos

Alvo:

  • Elementor Pro ≤ 4.2.1 (todas as versões anteriores são afetadas)
  • Pelo menos uma página publicada com um widget de Formulário contendo um campo de Upload de Arquivo
  • O campo de upload não deve estar marcado como Obrigatório (estado padrão)
  • Sem CAPTCHA no formulário (reCAPTCHA/turnstile bloqueia o envio não autenticado)
  • O diretório de uploads deve executar PHP (padrão na maioria das hospedagens Apache/cPanel; bloqueado em algumas configurações nginx endurecidas)

Atacante:

  • Python 3.9+ (apenas biblioteca padrão — sem dependências)
  • Acesso de rede ao alvo

Uso

Alvo único (descobre automaticamente a página do formulário via sitemap/página inicial):

python script.py --url https://target.example --command "id; hostname; uname -a" --cleanup

Página de formulário explícita:

python script.py --url https://target.example --page-url https://target.example/contact/ --cleanup

Modo lote (sites.txt: um site por linha — base_url ou base_url page_url):

python script.py --list sites.txt --command "id" --cleanup --out results.json

Formato de lista JSON:

[{"url": "https://a.example"}, {"url": "https://b.example", "page_url": "https://b.example/jobs/"}]

Executar um comando em um shell já enviado:

python script.py --url https://target.example --shell-url https://target.example/wp-content/uploads/elementor/forms/<name>.php --command "id"

Opções principais

FlagPadrãoSignificado
--url-URL base do alvo único
--list-arquivo de lista do modo lote
--page-url--urlpágina que contém o formulário
--commandid; hostname; uname -acomando a ser executado através do shell
--cleanupdesativadoauto-excluir o webshell após o teste
--field k=v-substituir um campo de formulário preenchido automaticamente (repetível)
--tail0.3segundos antes do tempo estimado de upload para varredura fina
--step-fine1passo em microssegundos da varredura fina
--full-seconddesativadoforçar bruta o segundo completo do uniqid (supera a dessincronização de relógio)
--attempts1tentativas de upload+varredura (novo nome de arquivo aleatório a cada vez)
--max-probes600000orçamento de solicitações de varredura por tentativa
--workers50threads paralelas de varredura
--insecuredesativadoignorar erros de TLS (alvos com certificado autoassinado)
--out file.json-gravar o relatório como JSON

Como a ferramenta funciona

  1. Descoberta — busca a página alvo (ou rastreia o sitemap e os links da página inicial, máx. 20 páginas) para encontrar um formulário com campo de Upload de Arquivo.
  2. Raspagem — extrai post_id, form_id, o nome do campo de upload e todos os outros campos do formulário; preenche automaticamente todos os campos com valores plausíveis para que os campos obrigatórios passem na validação (substitua com --field).
  3. Upload — envia o POST multipart de duas partes para admin-ajax.php. Observação: success:false com um objeto errors vazio ainda é tratado como enviado, porque a ação padrão de Email lança um erro após a movimentação do arquivo quando wp_mail() falha. Apenas uma rejeição do próprio campo de upload (file type is not allowed) conta como bloqueado.
  4. Recuperação do nome do arquivo — uniqid() = 8 hex segundos + 5 hex microssegundos. Os segundos vêm do cabeçalho Date da resposta; a fração de sub-segundo é estimada a partir de (t1 - date_epoch) % 1 (precisa quando os relógios do atacante e do servidor estão próximos). Um prober keep-alive (~30x mais rápido que uma solicitação por conexão) varre a janela de movimentação em resolução de microssegundos; --full-second força bruta o segundo inteiro quando os relógios estão dessincronizados.
  5. Execução — GET <shell>?c=<command> executa o comando; --cleanup exclui o shell via ?x=1.

Estados de resultado

StatusSignificado
vulnerableshell enviado e comando executado — aplique o patch agora
blockedcampo de upload rejeitado (corrigido na 4.2.2+, campo obrigatório, WAF, captcha)
uploaded_no_execarquivo enviado, mas nome não recuperado (tente novamente com --full-second)
no_formnenhum formulário vulnerável encontrado no alvo
errorerro de conexão/rede

Reprodução em laboratório

docker-compose.yml + setup_form_page.php reproduzem o alvo vulnerável:

Baixar ferramenta