Proteggersi da attacchi in un modulo di download PHP
inserito nella categorie: PHP, Sicurezza
marchiato con i tag: download, hack, hacker, hacking, path, php, sicurezza, unix
Oggi mentre sviluppavo la mia ultima applicazione mi son reso conto di una gigantesca falla di sicurezza nel mio modulo di download scritto in PHP.
Praticamente era un semplice script che riceveva in ingresso un parametro file e ne effettuava il download al solito modo PHP impostando gli header e bla bla bla.
Nelle mie intenzioni, il modulo dovevo scaricare file solo da una determinata cartella music all’interno del mio server, tutto ciò che era al di sopra della suddetta cartella non sarebbe dovuto essere toccato.
Quindi il codice iniziale consisteva nel seguente snippet molto semplice:
$u = $_GET["file"];
$safedir = "./music";
if ( substr($u, 0, strlen($safedir)) != $safedir ) die("Hack?");
Credevo funzionasse, quando poi mi son ricordato dei link simbolici dei sistemi Unix, vale a dire i '/./', '/../' and extra '/' .
Già, perchè se qualche malitenzionato avesse inserito nella barra degli indirizzi la seguente stringa:
....../download.php?file=./music/../somefile.php
Si sarebbe ritrovato il file somefile.php sul suo computer, con tanto di codice php esposto a rischi di sicurezza.
Ma non solo, avrebbe anche potuto fare qualcosa del tipo:
....../download.php?file=./music/../../../../somedir/someunixfile.exst
Molto più pericoloso.
Per chi non lo sapesse, il link simbolico '/../' serve per ritornare alla directory padre.
Quindi mi son precipitato a cambiare quel codice, in questo:
Utilizzando la funzione realpath, il PHP risolve tutti i link simbolici, evitando hack di quel tipo.
Commenta anche tu!