PDA

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?

cionci
05-01-2009, 13:37
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

cionci
05-01-2009, 14:22
Tutto bene :)

Credo che sia l'unica strada percorribile.

pium4
06-01-2009, 12:47
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

kk3z
06-01-2009, 13:02
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).

pium4
06-01-2009, 13:05
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

cionci
06-01-2009, 15:25
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.

cionci
06-01-2009, 15:53
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