Nozioni basilari di (in)sicurezza delle applicazioni Web – Parte 4 – Directory Traversal [PentesterLab]

Tempo di lettura: 6 minuti
Data pubblicazione: March 27, 2017

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.

Esempio 1

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
Stampa del file passwd
Stampa del file 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.

Esempio 2

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"
Codice Sorgente pagina PHP
Codice Sorgente pagina PHP

Il programmatore ha semplicemente inserito il controllo per verificare se è presente il path, ma, come abbiamo visto, è chiaramente evadibile.

Esempio 3

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>

Conclusioni

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.