jueves, junio 12, 2014

Configuración del handler PHP peligrosa para tu sitio Web

Cuando se configura un manejador de extensiones en un servidor web como Apache o Internet Information Services, el servidor web entregará todas las peticiones que se hagan a ficheros de las extensiones registradas al motor configurado para ellas y dejará que sea él quién genere el tratamiento y respuesta adecuado. Así, cuando llega una petición a un fichero JSP o PHP se entregará a un aplicativo u otro, siempre según la configuración de los manejadores de extensiones en el servidor web.

Esto hace que por ejemplo encontremos mensajes de error diferentes cuando hay se recibe de un servidor web un error en un fichero .PHP, o un 404 de un JSP, un 404 de un ASP o un 404 de un TCL. Es simplemente porque son los motores que manejan las extensiones los responsables de generar esos esos códigos y respuestas de error que a veces dan tanto juego.

En el caso de PHP hay una configuración insegura que se encuentra en algunos servidores en los que se configura que deben ser entregados al motor de PHP todos aquellos ficheros con extensión PHP. Si esto no se hace correctamente puede generar problemas de seguridad  graves. En este entorno se puede ver una configuración del manejador de PHP pensada para que se ejecuten todos los ficheros .PHP.

Figura 1: Configuración insegura de un manejador de PHP5

Sin embargo, la expresión regular no está creada para que la extensión sea la última del fichero, por lo que un atacante podría hacer uso del truco de la doble extensión y subir un fichero .PHP.otra_extensión que también sería ejecutada por el servidor - en este caso Apache -. En este ejemplo sencillo el fichero realmente ejecuta un phpinfo().

Figura  2: Fichero test.php.unknow es un PHP que ejecuta un phpinfo()

Una vez subido al servidor web, se puede ver como el motor PHP ejecuta el código contenido en ese fichero. Esto es únicamente por que el nombre del fichero tiene la cadena .PHP, sin importar que esta cadena no sea la parte final del archivo.

Figura 3: Ejecución del fichero test.php.unknow

¿Por qué es esto importante?

Pues porque si un programa de la web que permite subir ficheros hace un forzado seguro de extensión, comprobando que la extensión de un fichero que se sube sea .TXT y resulta que el atacante sube algo como .PHP.TXT entonces el filtro de la web funcionará bien, pero seguirá siendo inseguro para el servidor web.

Para solucionar esto, la configuración que debe realizarse en el manejador debe forzar a que esa cadena sea la última del nombre del fichero. La siguiente captura muestra un ejemplo de expresión regular que configura el manejador solo para ficheros que terminen en las extensiones controladas de PHP.

Figura 4: Expresiones regulares para una configuración segura del manejador de PHP

Si vas a fortificar un servidor Linux con un servidor Web Apache y quieres poner un framework PHP por encima tipo WordPress, Joomla, Prestashop o similares en los que vas a permitir que se suban ficheros desde el cliente - además de poner Latch que nunca viene mal }:) - asegúrate de que filtras bien las extensiones en el framework y de que el manejador de extensiones de tu Apache está correctamente configurado no te vayas a comer una webshell.

Saludos Malignos!

5 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Pues no sé que Apache waltrapa tienes tú, porque el mío lo tengo con AddHandler, y he probado creando un test.php.txt y no se ejecuta (se sirve el fichero tal cual).

    ResponderEliminar
  3. Al "genious" del «Apache waltrapa»: si utilizas una extensión que conoce Apache, es lógico que lo sirva correctamente.

    Cambia test.php.txt por test.php.unknown (o cualquier extensión no reconocida) y prueba de nuevo.

    ResponderEliminar
  4. Es más o menos como lo pone por defecto Plesk:


    SetHandler application/x-httpd-php


    SetHandler application/x-httpd-php-source


    Me acabo de enterar cuando he comprobado a ponerlo como has dicho.

    Muy bueno el consejo!

    ResponderEliminar