View Full Version : [PHP] Problema Sicurezza (Bypass Upload Form)
Alessio.16390
05-01-2009, 01:33
Ciao a tutti, ho un piccolo problemino.
Con il seguente codice filtro i file accettati :
if (($HTTP_POST_FILES['userfile']['type']=="image/gif") || ($HTTP_POST_FILES['userfile']['type']=="image/pjpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/jpeg") || ($HTTP_POST_FILES['userfile']['type']=="image/bmp") || ($HTTP_POST_FILES['userfile']['type']=="image/png")) {......
Il tutto funziona..
Ora viene il ma,
Facendo un paio di prove, il sistema risulta vulnerabile se ad esempio uplodo nel form un file con estensione .php con codice maligno(c99 e simili) inserendo sulla prima riga la dicitura GIF89aP
Il filtro crede sia un file GIF e quindi il codice maligno bypassa il filtro.
Ovviamente uplodando il solo codice maligno senza GIF89aP il filtro blocca il file..
E' possibile risolvere la cosa senza ricorrere ad un filtro estensioni?
Non credo sia possibile fare qualcosa di diverso dal ricorrere ad un filtro sulle estensioni. Magari ragiona in maniera diversa: non permettere l'upload se il file ha estensione .php o comunque una delle estensioni supportate dall'interprete php.
Alessio.16390
05-01-2009, 14:19
Ciao cionci, come va? ;)
Purtroppo immaginavo che l'unico metodo fosse questo.
Proverò con una soluzione del genere :
-
-
Ma se qualcuno ha idee migliori.. :O
Tutto bene :)
Credo che sia l'unica strada percorribile.
capisco il problema ma a livello funzionale non basta settare un .htaccess che blocca l'accesso alla directory a tutti e non far eseguire il codice php se non alla directory dove sta l'index
Non dovresti mai usare il mimetype che trovi nell'array $_FILES, perchè viene fornito dal browser (e quindi è falsificabile). Prova ad usare mime_content_type($path) oppure exec("file -bi $path", $output), probabilmente è più accurato.
L'altra soluzione è usare getimagesize(), se ritorna false il file non è un'immagine (ma questa soluzione funziona solo se vuoi uploadare immagini).
Non dovresti mai usare il mimetype che trovi nell'array $_FILES, perchè viene fornito dal browser (e quindi è falsificabile). Prova ad usare mime_content_type($path) oppure exec("file -bi $path", $output), probabilmente è più accurato.
L'altra soluzione è usare getimagesize(), se ritorna false il file non è un'immagine (ma questa soluzione funziona solo se vuoi uploadare immagini).
Bravo!! non ci avevo pensato!!!
cmq ci sono gli scanner per le shell....te ne passo qualcuno appena posso
Non dovresti mai usare il mimetype che trovi nell'array $_FILES, perchè viene fornito dal browser (e quindi è falsificabile). Prova ad usare mime_content_type($path) oppure exec("file -bi $path", $output), probabilmente è più accurato.
Il secondo metodo funziona solo su hosting linux...
Il primo se non sbaglio necessita dell'estensione mime_magic e guardate cosa ho trovato sulla documentazione php:
This function has been deprecated as the PECL extension Fileinfo provides the same functionality (and more) in a much cleaner way.
http://it2.php.net/manual/en/ref.fileinfo.php
Da PHP 5.3 è incluso ed abilitato di default.
Vincenzo1968
06-01-2009, 15:51
Puoi leggere l'header del file e verificare se si tratta di un "gif", "jpg", "jpeg", "bmp" o "png".
In PHP non so come si fa. Posso mostrarti un esempio in C.
Puoi leggere l'header del file e verificare se si tratta di un "gif", "jpg", "jpeg", "bmp" o "png".
In PHP non so come si fa. Posso mostrarti un esempio in C.
E' già tutto implementato...perché mettersi a leggere l'header ? FileInfo e mime_content_type vanno a leggersi l'header
Vincenzo1968
06-01-2009, 16:04
E' già tutto implementato...perché mettersi a leggere l'header ? FileInfo e mime_content_type vanno a leggersi l'header
Allora chiedo umilmente venia. Non sapevo che fosse già implementato in PHP(Non ne capisco un tubo di programmazione web).
:bimbo:
Alessio.16390
07-01-2009, 04:45
L'altra soluzione è usare getimagesize(), se ritorna false il file non è un'immagine (ma questa soluzione funziona solo se vuoi uploadare immagini).
Questa mi piace, proverò! Grazie :O
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.