Come per lo scorso articolo, gli esempi sono stati presi da PentesterLab e sarà inserito il codice opportunamente commentato, in modo da capire anche quali sono i problemi lato server.
L’attacco Directory Traversal consiste nell’accedere a file non presenti nell’applicazione web e non visualizzabili normalmente, scalando trasversalmente la directory parente del file a cui si sta accedendo. L’obiettivo è quello di avere accesso al sistema ospitante l’applicazione, sfruttando i permessi che la stessa possiede.
L’attacco è generalmente semplice: se l’applicazione richiede un file tramite una GET, come
www.appvulnerabile.it/upload/immagine.jpg
possiamo risalire il percorso, inserendo il classico comando ../, per raggiungere altri file, ad esempio il tanto cercato /etc/shadow
www.appvulnerabile.it/upload/../../../../etc/shadow
Non c’è bisogno di inserire il preciso numero di scalata, poichè più se ne mettono, più ci sarà probabilità di raggiungere la home dell’applicazione.
In questo esempio basta inserire l’attacco base, selezionando quale file più ci aggrade.
http://192.168.1.104/dirtrav/example1.php?file=../../../../etc/passwd
Cercando di stampare shadow viene ritornato un errore, il che sta a significare che l’applicazione non ho i permessi di lettura di quel file. Il codice della pagina è
<?php
<span id="line2"></span>
<span id="line3"></span>$UploadDir = '/var/www/files/';
<span id="line4"></span>
<span id="line5"></span>if (!(isset($_GET['file'])))
<span id="line6"></span> die();
<span id="line7"></span>
<span id="line8"></span>
<span id="line9"></span>$file = $_GET['file'];
<span id="line10"></span>
<span id="line11"></span>$path = $UploadDir . $file;
<span id="line12"></span>
<span id="line13"></span>if (!is_file($path))
<span id="line14"></span> die();
<span id="line15"></span>
<span id="line16"></span>header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
....
..
.
?>
<span id="line17"></span>
Il problema sta nella dichiarazione della variabile $file, che, con una semplice GET recupera la stringa senza sanitizzarla.
Ora nella GET c’è il percorso completo. Eliminandolo ed inserendo la stringa precedente non si ottiene nulla, per cui è possibile che ci sia un controllo di base sull’attacco.
Invece che agire dalla barra degli indirizzi possiamo, con un dispositivo Linux, sfruttare il comando wget e ottenere la pagina richiesta.
wget -O esempio "http://192.168.1.104/dirtrav/example2.php?file=/var/www/files/../dirtrav/example2.php"
Il programmatore ha semplicemente inserito il controllo per verificare se è presente il path, ma, come abbiamo visto, è chiaramente evadibile.
L’immagine hacker è ora richiesta senza inserire nessuna estensione, quindi è probabile che venga inserita nel codice PHP. Questo è anche il motivo per cui inserendo l’attacco non viene restituito nulla.
Per evadere questo filtro, basta inserire un carattere NULL BYTE, il quale elimina il suffisso e ci permette di raggiungere il solito file passwd.
http://192.168.1.104/dirtrav/example3.php?file=../../../etc/passwd%00
Il codice presente è
<span class="error comment" title="Saw “<?”. Probable cause: Attempt to use an XML processing instruction in HTML. (XML processing instructions are not supported in HTML.)"><?php
<span id="line2"></span>$UploadDir = '/var/www/files/';
<span id="line3"></span>
<span id="line4"></span>if (!(isset($_GET['file'])))
<span id="line5"></span> die();
<span id="line6"></span>
<span id="line7"></span>
<span id="line8"></span>$file = $_GET['file'];
<span id="line9"></span>
<span id="line10"></span>$path = $UploadDir . $file.".png";
<span id="line11"></span>// Simulate null-byte issue that used to be in filesystem related functions in PHP
<span id="line12"></span>$path = preg_replace('/\x00.*/',"",$path);
<span id="line13"></span>
<span id="line14"></span>if (!is_file($path))
<span id="line15"></span> die();
<span id="line16"></span>
<span id="line17"></span>header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
....
..
.
?>
</span>
Chiaramente questo attacco può essere testato su server Windows, Linux e Mac, basta cambiare le modalità, come spiega ottimamente la guida di OWASP sul Directory Traversal.** È anche possibile automatizzare l’attacco**, con liste create ad hoc o con software, come DotDotPwn.