← Base de Vulnerabilidades
File System A01:2021-Broken Access Control CVSS 7.5

Path Traversal — Travessia de Diretório

Path Traversal permite ler arquivos fora do diretório permitido usando ../. Veja bypass de filtros (encoding, null byte) e como proteger endpoints de download.

Comum em: Endpoints de download, preview de arquivo, APIs de storage, geração de relatório · Dificuldade: Baixa — trivialmente testável

O Que É Path Traversal

Path Traversal (também Directory Traversal) permite que um atacante acesse arquivos fora do diretório-base da aplicação usando sequências de ../ (e variantes encoded). É especialmente crítico em funcionalidades de download de arquivo, preview de documento, e qualquer leitura de arquivo baseada em input do usuário. Pode levar à leitura de /etc/passwd, arquivos de configuração com credenciais, chaves SSH e código-fonte.

Exemplo Real de Ataque

HTTP Request / Response
# Tentativa direta
GET /api/v1/download?file=../../../etc/passwd
→ HTTP 403 (filtro básico detectado)

# Bypass via URL encoding
GET /api/v1/download?file=%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd
→ HTTP 200, conteúdo do /etc/passwd

# Bypass via double encoding
GET /api/v1/download?file=%252e%252e%252fetc%252fpasswd

# Bypass via null byte (versões antigas PHP)
GET /api/v1/download?file=../../../etc/passwd%00.pdf

Impacto no Negócio e Compliance

Leitura de arquivos de configuração (.env, config.yaml, database.yml) com credenciais de banco de dados e chaves de API. Acesso ao código-fonte da aplicação. Em casos com write access: comprometimento total via sobrescrita de arquivos de configuração ou web shells.

CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N

Como Remediar

import os
from pathlib import Path

BASE_DIR = Path("/app/uploads").resolve()

def safe_file_path(filename: str) -> Path:
    # ✅ Canonicalize e valide que o path resultante está dentro do BASE_DIR
    safe_path = (BASE_DIR / filename).resolve()
    
    # Verifica se o path canonicalizado está dentro do diretório base
    if not str(safe_path).startswith(str(BASE_DIR)):
        raise ValueError(f"Path traversal detectado: {filename}")
    
    if not safe_path.exists():
        raise FileNotFoundError(f"Arquivo não encontrado")
        
    return safe_path

# ✅ Adicionalmente: use IDs para referenciar arquivos, não nomes
# Mapeie file_id → path no banco de dados, nunca exponha o path real

Como a Veyronn Detecta Esta Vulnerabilidade

Testamos path traversal em todos os parâmetros de nome de arquivo, tanto na URL quanto em JSON bodies. Tentamos múltiplos encodings para bypass: URL encoding (%2e%2e%2f), double encoding, null byte, e variantes específicas de sistema operacional.

Pronto para Contratar seu Próximo Pentest?

Adquira nossa avaliação pontual feita pelos melhores profissionais do mercado ou implemente o software da Veyronn 24/7.