File upload inseguro
Cria dado de teste (use o prefixo pentest_). Limpe depois. Só em alvo seu ou autorizado por escrito.
O vetor
Vetor: upload que aceita qualquer arquivo pode receber webshell (PHP/JSP), polyglot (JPEG+PHP), ou zip slip. O que testamos: validação de tipo/conteúdo, onde o arquivo é salvo, se é executável.
Os passos
Passo 1 (🟡) — enviar arquivo com extensão perigosa:
echo '<?php echo "pentest"; ?>' > pentest_shell.php.jpg
curl -s -X POST "$BASE/api/upload" -F "file=@pentest_shell.php.jpg" -w "\n%{http_code}\n"
Passo 2 (🟢) — tentar acessar o que subiu:
curl -s "$BASE/uploads/pentest_shell.php.jpg" | head -c 100 # executou PHP? = crítico
O que esperar
- VULNERÁVEL: aceita e serve o arquivo de forma executável; confia no
Content-Typedo cliente. - SEGURO: valida magic bytes (não extensão), renomeia, salva fora da webroot, serve com
Content-Disposition: attachment, tamanho limitado.
Como corrigir
Correção (P1): validar tipo real, allowlist de extensões, storage isolado (R2/S3) sem execução, antivírus/exiftool para metadados.
Limpeza: rm pentest_shell.php.jpg local + apagar o upload de teste.