Esempio di Directory Trasversal

Quando si parla di Directory Trasversal ci si riferisce ad una nuova tipologia di attacco PHP. Ossia un utente che sia o meno autenticato chiede di visualizzare oppure eseguire file esterni alla directory che ha visulaizzato il codice che stiamo vedendo nel browser. Ossia un utente a questo punto un male intenzionato chiamiamolo pure hacker sta cercando di accedere a dei file di cui non dovrebbe avere il permesso all’accesso. Comunemente questo accade a causa di permessi delle directory che sono stati erroneamente configurati. Questo purtroppo aggrava il problema.

Facciamo un esempio . Pensiamo di avere un file il cui codice php è il seguente

$file = $_GET['file'];
include($file);

e al file get gli mettiamo nella barra degli indirizzi del borwser qualcosa del tipo /etc/passwd

in modo da avere

esempio.com/test.php?file=/ect/passwd

In questa maniera l’include sarà puntato nella directory password. Ammettiamo adesso che per errore o disattenzione quello che sia i permessi della cartella passwd siano rimasti su readble.

In questo caso avremo in output tutti i dati e i file della cartella. Dal cui nome si comprende perfettamente l’importanza….

Ovviamente non sempre si puo’ avere accesso al server e quindi impedire la lettura di determinate cartelle. Si puo’ limitare l’accesso della lettura ai crawler tramite robots.txt, ma sicuramente non agli hacker.

Ma ci sono due funizoni php che ci vengono incontro nella difesa.

Funzione Realname() Basename() PHP contro gli Hacker Directory Trasversal

Esempio di Directory Trasversal

La funzione Basename() restituisce unicamente il nome file di un determinato percorso / file

ad esempio

Input: ../../../etc/passwd
Output: passwd

E la funzione realname() che restituisce il percorso assoluto solo se il file esiste e se lo scopit in esecuzione disponde delle autorizzazioni eseguibili su tutte le directoty richieste.

Ad esempio

Input: ../../../etc/passwd
Output: /etc/passwd

Questo per dirvi dalla combinazione di queste due funzioni avremmo il codice sicuro.

$file = basename(realpath($_GET['file']));
include($file);

Con queste accortezze se noi riproviamo nel browser l’ipotietico file

esempio.com/test.php?file=/ect/passwd

otterremmo la pagina vuota, ossia non verrà passato nessun dato e i nostri dati dentro la cartella passwd saranno al sicuro da eventuali intrusioni. Ma un hacker esperto può aggirare facilmente questo blocco riscrivendo ad esempio nella barra degli indirizzi come

..%2F..%2F..%2Fetc%2F



Ovviamente anche qui il problema è risolvibile intercettando e controllando la stringa con la gestione delle stringe in PHP 

Ma il problema rimane comunque lo stesso . Ossia una continua lotta fra l’hacking e il defender.