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-Type do 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.

PurpleLab // plataforma de treino ofensivo + defensivo // Fase 1 — portal dinamico