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
.htaccessoweb.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).