Aplicações web manipulam arquivos o tempo todo — uploads de foto de perfil, importação de documentos, inclusão de templates. E o manuseio inseguro de arquivos abre alguns dos caminhos mais diretos para o comprometimento do servidor. Esta aula cobre três vulnerabilidades relacionadas: o upload de arquivo malicioso, a Local File Inclusion (LFI) e a Remote File Inclusion (RFI) — mais o path traversal que as acompanha. Todas exploram a confiança indevida da aplicação em nomes e conteúdos de arquivos controlados pelo usuário. Pratique no DVWA.
O upload que vira web shell
Comece pelo upload de arquivo malicioso, um caminho clássico para execução de código no servidor. Muitas aplicações permitem que o usuário faça upload de arquivos — e se a aplicação não valida adequadamente o que é enviado, o atacante pode subir um arquivo que não é o que a aplicação espera. O cenário mais perigoso: subir um web shell — um pequeno script (em PHP, por exemplo) que, quando acessado no servidor, executa comandos. Se o atacante consegue subir um shell.php e depois acessá-lo pela URL, ele obtém execução de comandos no servidor (conectando com a command injection da aula Command Injection: do navegador ao sistema operacional e o reverse shell da aula O que é um exploit: da vulnerabilidade ao acesso). A raiz é a validação insuficiente: a aplicação aceita o arquivo por confiar na extensão, no tipo declarado, ou simplesmente não verificar. Atacantes contornam validações fracas de várias formas — extensões alternativas, manipulação do tipo de conteúdo (que você altera no Burp, aula Burp Suite: a bancada de trabalho do pentester web), duplas extensões, e outras técnicas que exploram como a validação (mal feita) distingue arquivos "seguros" de "perigosos".
Local File Inclusion
Agora a Local File Inclusion (LFI). Algumas aplicações incluem arquivos dinamicamente com base na entrada do usuário — por exemplo, pagina.php?arquivo=sobre.php inclui sobre.php. Se o parâmetro arquivo não é validado, o atacante pode fazer a aplicação incluir outros arquivos do servidor que não deveria — arquivos de configuração, arquivos de senha do sistema (o /etc/passwd do Linux), logs, código-fonte. É aqui que entra o path traversal (travessia de diretório): usando sequências como ../ (que sobe um nível no sistema de arquivos), o atacante "navega" para fora do diretório pretendido até o arquivo-alvo:
# a aplicação esperava incluir uma página local
pagina.php?arquivo=sobre.php
# o atacante navega para fora, com path traversal:
pagina.php?arquivo=../../../../etc/passwd
# ↑ cada ../ sobe um diretório até alcançar /etc/passwd
Path traversal e log poisoning
A LFI vaza arquivos sensíveis, e em certas condições escala para execução de código — se o atacante consegue incluir um arquivo que ele controla e que contém código (por exemplo, combinando LFI com um upload, ou incluindo um arquivo de log onde ele injetou código via requisições — as técnicas de "log poisoning"). O path traversal, mais amplamente, é a capacidade de acessar arquivos fora do escopo pretendido, e aparece em muitos contextos além da LFI (em downloads, em uploads que não sanitizam o caminho de destino).
Remote File Inclusion, a prima perigosa
A Remote File Inclusion (RFI) é a prima mais perigosa da LFI: em configurações vulneráveis, a aplicação pode ser induzida a incluir um arquivo de uma URL remota — de um servidor controlado pelo atacante. Assim, o atacante hospeda seu código malicioso no próprio servidor e faz a aplicação-alvo incluí-lo e executá-lo, obtendo execução de código diretamente. A RFI é mais rara hoje (configurações modernas geralmente a desabilitam), mas quando presente, é um caminho direto para comprometer o servidor, porque o atacante controla totalmente o conteúdo incluído.
Confiança indevida em nome e conteúdo
O ponto conceitual que une as três: todas exploram a confiança indevida em nomes ou conteúdos de arquivos controlados pelo usuário. O upload confia no conteúdo (aceitando um arquivo perigoso); a LFI e a RFI confiam no nome/caminho (permitindo incluir arquivos indevidos, locais ou remotos). É uma variação do tema do bloco — não confiar na entrada do usuário — aplicada especificamente ao manuseio de arquivos, onde a entrada não é um comando ou um script, mas um nome de arquivo ou um conteúdo de arquivo que a aplicação processa perigosamente. Reconhecer que "nomes de arquivo e conteúdos enviados são entrada não confiável" é a lição transversal.
Validar tipo, renomear e isolar
Do lado defensivo, cada vulnerabilidade tem contramedidas específicas. Para upload: validar rigorosamente o tipo de arquivo (por conteúdo real, não só extensão — allowlist de tipos permitidos), renomear os arquivos enviados (não confiar no nome do usuário), armazená-los fora do diretório web (para que não possam ser executados diretamente pela URL), e limitar tamanho e verificar com antivírus. Para LFI/RFI e path traversal: validar e sanitizar rigorosamente qualquer entrada usada em caminhos de arquivo (allowlist de valores permitidos, em vez de tentar filtrar ../ — que é contornável), evitar incluir arquivos com base em entrada do usuário, e desabilitar a inclusão remota (fechando a RFI na configuração). Transversalmente: menor privilégio (para que a aplicação não acesse arquivos sensíveis do sistema) e armazenamento adequado. A lição unificada, ecoando o bloco inteiro: trate nomes e conteúdos de arquivo como entrada não confiável, valide por allowlist, e limite o que a aplicação pode acessar e executar.
Fontes e leituras recomendadas
- PortSwigger Web Security Academy — labs de file upload e path traversal
- OWASP — File Upload e Path Traversal (Testing Guide e prevenção)
- DVWA — módulos de File Upload e File Inclusion
- HackTricks — seções de file upload, LFI e RFI (técnicas de contorno)
Exercícios
-
Como o upload de arquivo malicioso leva à execução de código no servidor, e qual a raiz do problema?
✓ Resposta:O atacante faz upload de um arquivo que não é o esperado — tipicamente um web shell (script que executa comandos) — e, se consegue acessá-lo pela URL, obtém execução de comandos no servidor. A raiz é a validação insuficiente: a aplicação aceita o arquivo por confiar na extensão/tipo declarado ou por não verificar adequadamente o conteúdo.
-
O que é Local File Inclusion, e como o path traversal (
../) é usado para explorá-la?✓ Resposta:LFI é quando a aplicação inclui arquivos com base em entrada do usuário sem validá-la, permitindo incluir arquivos indevidos do servidor. O path traversal usa sequências
../para subir níveis no sistema de arquivos e navegar para fora do diretório pretendido até o arquivo-alvo (ex.:../../../../etc/passwd). -
Qual a diferença entre LFI e RFI, e por que a RFI é considerada mais perigosa quando presente?
✓ Resposta:Na LFI, incluem-se arquivos locais do servidor; na RFI, a aplicação é induzida a incluir um arquivo de uma URL remota controlada pelo atacante. A RFI é mais perigosa porque o atacante controla totalmente o conteúdo incluído, hospedando seu próprio código malicioso e obtendo execução direta no servidor.
-
Qual o tema comum que une upload malicioso, LFI e RFI em termos de confiança?
✓ Resposta:Todas exploram a confiança indevida em nomes ou conteúdos de arquivos controlados pelo usuário: o upload confia no conteúdo enviado; a LFI e a RFI confiam no nome/caminho fornecido. É o tema "não confiar na entrada do usuário" aplicado ao manuseio de arquivos.
-
Cite duas defesas contra upload malicioso e explique por que armazenar uploads fora do diretório web é importante.
✓ Resposta:Defesas: validar o tipo real do arquivo (allowlist, por conteúdo), renomear os arquivos, limitar tamanho, verificar com antivírus, e armazenar fora do diretório web. Armazenar fora do diretório web é importante porque impede que o arquivo enviado seja executado diretamente ao ser acessado pela URL — mesmo que um web shell seja enviado, ele não pode ser invocado como código pelo servidor web.