_TPProblemas de seguridad con los uploads en PHP X.X

Escrito el 1 marzo, 2002 – 16:12 | por storm | 850 lecturas

_TPMuchos sitios estan “alertando” estos dias sobre un problema de seguridad en el mecanismo de uploads de PHP que podria, eventualmente, poner en riesgo a varios sitios. En esta nota describimos el problema y la solucion.
_TPVersiones de PHP afectadas: TODAS
Riesgo: usuarios maliciosos pueden visualizar informacion (archivos) almacenados en el servidor.

En primer lugar debemos comentar que este problema no es un problema nuevo, ya desde las versiones 3.x de PHP este problema existe y mas que un problema podriamos describirlo como una caracteristica de PHP que obliga a programar con mucho cuidado todos los scripts que procesan uploads para no incurrir en potenciales problemas de seguridad.

El problema es que al procesar un form de upload en donde el “name” del form es “foo” php pone a disposicion del script las variables $foo,$foo_name, $foo_size y $foo_type con informacion sobre el archivo (path, nombre, size y tipo respectivamente). Esto se debe a un mecanismo denominado “register_globals” de PHP por el cual todos los datos ingresados en un formulario HTML pasan a ser variables globales
esto es en si mismo un problema de seguridad ya que eventualmente el usuario puede, si conoce o acierta el nombre de las variables sobreescribir el contenido de las mismas mediante un formulario HTML.

En nuestro ejemplo de uploads si el usuario genera algo de la forma:





El script procesara el upload como si el usuario estuviera subiendo /etc/passwd, basta con que alla un mecanismo para obtener el upload, downlodearlo o visualizarlo para que el usuario obtenga el archivo, de esta forma se pude acceder a codigo, archivos sensibles o informacion almacenada en el servidor.

Solucion:

Validar los paths de las variables que deberian contener el path del archivo uplodeado.

Otra solucion pasa por desactivar “register_globals” del archivo php.ini lo cual, lamentablemente puede hacer que muchos scripts dejen de funcionar, la otra solucion es el patch que php.net ya provee para las principales versiones de PHP desde la 3.x o bien instalar la version 4.12 que ya corrige el problema. Por otro lado es altamente recomendable usar las nuevas variables que provee PHP desde el 4.11 que son:

$_GET – contains form variables sent through GET
$_POST – contains form variables sent through POST
$_COOKIE – contains HTTP cookie variables
$_SERVER – contains server variables (e.g., REMOTE_ADDR)
$_ENV – contains the environment variables
$_REQUEST – a merge of the GET variables, POST variables and Cookie variables. In other words – all the information that is coming from the user, and that from a security point of view, cannot be trusted.
$_SESSION – contains HTTP variables registered by the session module

Usando estas variables y deshabilitando “register_globals” es posible asegurarse que ciertas variables sean unicamente creadas por el script y no sean modificables por el usuario, ademas de poder validar correctamente toda la informacion ingresada por el usuario que es la que no es confiable.

Recomendaciones:
Instalar el patch o PHP 4.12 en todos los servidores corriendo PHP.
Usar las nuevas variables de PHP 4.x y deshabilitar “register_globals” para evitar potenciales problemas de seguridad que van incluso mas alla de este problema con los uploads.

Garland Foster.

You must be logged in to post a comment.

Buscar: