PortSwigger Academy – Directory traversal
Continua il percorso di apprendimento suggerito da “PortSwigger Academy”. Consiglio di iscriversi alla piattaforma, seguire le lezioni e soprattutto svolgere e completare i lab 🙂
Directory traversal
In questa sezione spiegheremo cos’è il “directory traversal” o “path traversal”, descriveremo come eseguire attacchi di directory traversal e aggirare gli ostacoli comuni e spiegheremo come prevenire tali vulnerabilità.
Cos’è il directory traversal?
L’attraversamento delle directory “directory traversal” (noto anche come attraversamento del percorso dei file “path traversal”) è una vulnerabilità della sicurezza Web che consente a un utente malintenzionato di leggere file arbitrari sul server su cui è in esecuzione un’applicazione. Ciò potrebbe includere codice e dati dell’applicazione, credenziali per sistemi back-end e file sensibili del sistema operativo. In alcuni casi, un utente malintenzionato potrebbe essere in grado di scrivere su file arbitrari sul server, consentendogli di modificare i dati o il comportamento dell’applicazione e, infine, di assumere il pieno controllo del server.
Lettura di file arbitrari tramite directory traversal
Considera un’applicazione per lo shopping che visualizza immagini di articoli in vendita. Le immagini vengono caricate tramite codice HTML come il seguente:
<img src="/loadImage?filename=218.png">
L’URL loadImage accetta un parametro filename e restituisce il contenuto del file specificato. I file immagine stessi sono archiviati su disco nella posizione /var/www/images/. Per restituire un’immagine, l’applicazione aggiunge il filename richiesto a questa directory di base e utilizza un’API del file system per leggere il contenuto del file. Nel caso precedente, l’applicazione legge dal seguente percorso:
/var/www/images/218.png
L’applicazione non implementa difese contro gli attacchi di directory traversal, quindi un utente malintenzionato può richiedere il seguente URL per recuperare un file arbitrario dal file system del server:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
Ciò fa sì che l’applicazione legga dal seguente percorso di file:
/var/www/images/../../../etc/passwd
La sequenza ../ è valida all’interno di un percorso di file e significa salire di un livello nella struttura delle directory. Le tre sequenze ../ consecutive salgono da /var/www/images/ alla root del filesystem, e quindi il file che viene effettivamente letto è:
/etc/passwd
Sui sistemi operativi basati su Unix, questo è un file standard contenente i dettagli degli utenti registrati sul server.
Su Windows, sia ../ che ..\ sono sequenze di directory traversal valide e un attacco equivalente per recuperare un file del sistema operativo standard sarebbe:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
Lab: File path traversal, simple case
Ostacoli comuni allo sfruttamento delle vulnerabilità del file path traversal
Molte applicazioni che inseriscono l’input dell’utente nei percorsi dei file implementano una sorta di difesa contro gli attacchi di path traversal e questi possono spesso essere aggirati.
Se un’applicazione rimuove o blocca le sequenze di directory traversal dal nome file fornito dall’utente, potrebbe essere possibile aggirare la difesa utilizzando una varietà di tecniche.
Potresti essere in grado di utilizzare un percorso assoluto dalla radice del filesystem, come filename=/etc/passwd, per fare riferimento direttamente a un file senza utilizzare alcuna sequenza trasversale.
Lab: File path traversal, traversal sequences blocked with absolute path bypass
Potresti essere in grado di utilizzare sequenze di attraversamento nidificate, come ….// o ….\/, che torneranno a sequenze di attraversamento semplici quando la sequenza interna viene rimossa.
Lab: File path traversal, traversal sequences stripped non-recursively
In alcuni contesti, ad esempio in un percorso URL o nel parametro del filename di una richiesta multipart/form-data, i server Web potrebbero eliminare qualsiasi sequenza di attraversamento della directory prima di passare l’input all’applicazione. A volte è possibile ignorare questo tipo di sanificazione mediante la codifica dell’URL, o anche la doppia codifica dell’URL, i caratteri ../, risultando rispettivamente in %2e%2e%2f o %252e%252e%252f. Anche varie codifiche non standard, come ..%c0%af o ..%ef%bc%8f, possono funzionare allo stesso modo.
Per gli utenti di Burp Suite Professional, Burp Intruder fornisce un elenco di payload predefinito (Fuzzing – path traversal), che contiene una varietà di sequenze di percorso trasversale codificate che puoi provare.
Lab: File path traversal, traversal sequences stripped with superfluous URL-decode
Se un’applicazione richiede che il nome file fornito dall’utente inizi con la cartella di base prevista, ad esempio /var/www/images, potrebbe essere possibile includere la cartella di base richiesta seguita da sequenze di attraversamento adeguate. Per esempio:
filename=/var/www/images/../../../etc/passwd
Lab: File path traversal, validation of start of path
Se un’applicazione richiede che il nome file fornito dall’utente termini con un’estensione di file prevista, ad esempio .png, potrebbe essere possibile utilizzare un byte null per terminare in modo efficace il percorso del file prima dell’estensione richiesta. Per esempio:
filename=../../../etc/passwd%00.png
Lab: File path traversal, validation of file extension with null byte bypass
Come prevenire un attacco directory traversal
Il modo più efficace per prevenire le vulnerabilità legate al file path traversal è evitare del tutto di passare l’input fornito dall’utente alle API del filesystem. Molte funzioni dell’applicazione che eseguono questa operazione possono essere riscritte per fornire lo stesso comportamento in modo più sicuro.
Se si ritiene inevitabile passare l’input fornito dall’utente alle API del filesystem, è necessario utilizzare insieme due livelli di difesa per prevenire gli attacchi:
- L’applicazione dovrebbe convalidare l’input dell’utente prima di elaborarlo. Idealmente, la convalida dovrebbe essere confrontata con una whitelist di valori consentiti. Se ciò non è possibile per la funzionalità richiesta, la convalida dovrebbe verificare che l’input contenga solo contenuti consentiti, ad esempio caratteri puramente alfanumerici.
- Dopo aver convalidato l’input fornito, l’applicazione dovrebbe aggiungere l’input alla directory di base e utilizzare un’API del file system della piattaforma per canonizzare il percorso. Dovrebbe verificare che il percorso canonizzato inizi con la directory di base prevista.
Di seguito è riportato un esempio di un semplice codice Java per convalidare il percorso canonico di un file in base all’input dell’utente:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}
Per saperne di più
Find directory traversal vulnerabilities using Burp Suite’s web vulnerability scanner