Path Traversal

Indice dei contenuti

    Il path traversal (noto anche come directory traversal o ../ attack) è una vulnerabilità in cui l’applicazione costruisce un percorso file a partire da input utente senza neutralizzare le sequenze di attraversamento della directory. L’attaccante inietta sequenze ../ per risalire l’albero del filesystem oltre la directory radice prevista, accedendo a file arbitrari del sistema — file di configurazione, chiavi private, database, file di sistema.

    È classificata CWE-22 ed è inclusa nell’OWASP Top 10 (A01 Broken Access Control).

    Meccanismo

    Il pattern vulnerabile più comune è un endpoint che serve file dinamicamente:

    GET /scarica?file=report.pdf HTTP/1.1

    Il server costruisce il path:

    # Codice vulnerabile
    import os
    base_dir = '/var/www/uploads/'
    filename = request.args.get('file')
    filepath = os.path.join(base_dir, filename)
    return open(filepath).read()

    L’attaccante invia:

    GET /scarica?file=../../../etc/passwd HTTP/1.1

    Il path risultante diventa /var/www/uploads/../../../etc/passwd che il sistema operativo risolve come /etc/passwd.

    Obiettivi tipici

    Su sistemi Linux/Unix:

    /etc/passwd          → lista utenti di sistema
    /etc/shadow          → hash delle password (se leggibile)
    /etc/hosts           → configurazione di rete
    /proc/self/environ   → variabili d'ambiente del processo (spesso contiene segreti)
    /proc/self/cmdline   → riga di comando del processo
    ~/.ssh/id_rsa        → chiave privata SSH dell'utente applicativo

    Su sistemi Windows:

    C:\Windows\System32\drivers\etc\hosts
    C:\inetpub\wwwroot\web.config   → configurazione IIS con connection string
    C:\Windows\win.ini

    File applicativi spesso bersagliati:

    .env                 → credenziali, chiavi API, segreti
    config/database.yml  → credenziali database
    /proc/self/fd/3      → file descriptor aperti (spesso log o database)

    Tecniche di bypass

    Le applicazioni che filtrano ../ in modo ingenuo possono essere aggirate con:

    # Encoding URL
    ..%2F..%2F..%2Fetc%2Fpasswd
    
    # Doppio encoding
    ..%252F..%252F..%252Fetc%252Fpasswd
    
    # Encoding misto
    ..%2F../etc/passwd
    
    # Backslash (Windows)
    ..\..\..\windows\win.ini
    
    # Sequenze ridondanti (se il filtro elimina ../ una sola volta)
    ....//....//etc/passwd
    ..../\..../\etc/passwd
    
    # Null byte (vecchie versioni PHP) per troncare l'estensione aggiunta
    ../../../etc/passwd%00.jpg

    Path traversal con scrittura (write traversal)

    Quando l’applicazione scrive file in base all’input utente, il path traversal può portare a:

    • Sovrascrittura di file di configurazione: es. sovrascrivere .htaccess o web.config.
    • Caricamento di webshell: se il traversal permette di scrivere in una directory servita dal web, l’attaccante carica codice eseguibile.
    • Log poisoning + LFI: scrivere payload in un file di log, poi includerlo tramite Local File Inclusion per eseguire codice.

    Contromisure

    Canonicalizzazione e validazione del path:

    import os
    
    BASE_DIR = '/var/www/uploads'
    
    def safe_file_path(filename):
        # Risolve il path assoluto (elimina ../)
        safe_path = os.path.realpath(os.path.join(BASE_DIR, filename))
        # Verifica che il path risultante sia dentro BASE_DIR
        if not safe_path.startswith(BASE_DIR + os.sep):
            raise ValueError("Path traversal rilevato")
        return safe_path

    La chiamata a os.path.realpath() (o Path.resolve() in Python, realpath() in C, Paths.get().normalize().toRealPath() in Java) risolve tutti i componenti ../ e i symlink prima della validazione.

    Lista bianca dei file consentiti: se l’insieme dei file servibili è limitato e noto, usare identificatori opachi (es. UUID) che mappano internamente ai file reali, senza esporre mai il nome o il path.

    Chroot / container isolation: eseguire il processo applicativo in un ambiente isolato (chroot jail, container) in modo che il filesystem visibile sia limitato a ciò che è strettamente necessario.

    Separazione delle directory: non servire mai file dalla stessa directory che contiene codice applicativo, configurazione o segreti.

    Relazione con altri argomenti

    • OWASP Top 10 — A01 Broken Access Control.
    • Privilege Escalation — l’accesso a file di configurazione o chiavi tramite path traversal è spesso il primo passo di un’escalation.
    • Container Security — i container limitano la superficie esposta da un path traversal.
    • CWE — classificato CWE-22 (Improper Limitation of a Pathname to a Restricted Directory).

    Ultimo aggiornamento: