Eliminar la posibilidad de leer archivos de sistema con PHP de Apache

1

Cuando subo un archivo php (archivo.php) con el siguiente contenido en el servidor Apache

<?php
$file = $_GET['file'];
include ( $file);
?>

Puedo leer cualquier archivo de Apache utilizando las siguientes URL

http://domain.com/file.php?file=/etc/passwd
http://domain.com/file.php?file=/etc/httpd/conf/httpd.conf
http://domain.com/file.php?file=/etc/php.ini
http://domain.com/file.php?file=/etc/my.cnf

Soy un usuario de Linux, así que conozco la ruta común de los archivos, son casi iguales en todos los servidores Linux.

No tengo control sobre qué código están cargando mis desarrolladores. El proceso de revisión del código está lleno de fallas y este tipo de código se puede cargar fácilmente en el servidor. Lo único que podemos hacer para prohibirlo es a través de los archivos de configuración.

¿Cómo puedo eliminar esta vulnerabilidad de Apache para que nadie pueda leer los archivos del sistema incluso si file.php está en htdocs?

    
pregunta Derek 23.06.2016 - 16:13
fuente

4 respuestas

1

La misma "vulnerabilidad" se encuentra en los lenguajes de programación C, Java, Perl, Ruby, Lisp, Fortran, BASIC, PASCAL, ALGOL ... casi universalmente proporcionan una construcción para leer archivos. Algunos archivos en un sistema Unix son legibles en todo el mundo.

  

No tengo control sobre los desarrolladores sobre qué código están cargando ...

Entonces, por todos los medios, trata de mitigar los errores estúpidos, pero no asumas que puedes hacer que el código sea seguro .

Con respecto al problema específico que describiste ...

open_basedir de PHP cierra muchas vías para leer archivos (no todas).

Ejecutar PHP en un chroot es un mecanismo más robusto para restringir el acceso a archivos, pero no impide el acceso al código PHP en sí.

Ejecutar PHP en un host separado agregará un poco de latencia, y realmente no tiene mucha ventaja sobre ejecutarlo chroot.

La forma correcta de solucionar el problema es a través de la revisión / auditoría apropiada del código.

    
respondido por el symcbean 24.06.2016 - 14:09
fuente
3

Esto no es una vulnerabilidad en Apache. Es una vulnerabilidad en su código PHP.

La función include(x) incluye el archivo x . Si permite que el usuario seleccione cualquier x , podrá incluir cualquier archivo. Si no quiere que ellos puedan hacer eso, entonces no escriba el código PHP que les permita. Le sugiero que solo pase constantes o valores de una lista blanca como parámetros a include() .

Si le preocupa que sus desarrolladores carguen un código incorrecto como este en el servidor, no hay nada que pueda hacer más que obtener mejores desarrolladores (educar o reemplazar) o un mejor proceso de revisión. En la práctica, se podría escribir un script de PHP para hacer cualquier cosa que el intérprete de PHP tenga privilegios para hacer, y eso es mucho. Por ejemplo, podría escribir una puerta trasera en PHP para que cualquier persona tenga acceso completo a su servidor.

Para repetir, no hay un archivo de configuración mágico que haga que PHP sea inherentemente seguro. La única manera de mantener su servidor seguro es solo cargarle un código seguro, ya sea en PHP o en cualquier otro idioma. No puedes obtener seguridad con solo presionar un botón; necesita integrar la perspectiva en todo su proceso de desarrollo.

    
respondido por el Anders 23.06.2016 - 17:43
fuente
0

Una forma de evitar que Apache lea los archivos del sistema (y, en general, cualquier archivo fuera del directorio raíz web) es con SELinux. Su objetivo principal es evitar el acceso inadecuado a los recursos del sistema (no restringido a la restricción de Apache, pero ese tipo de protección es uno de sus grandes beneficios).

Debería usar un sistema operativo que lo soporte, sin embargo, que probablemente sea RHEL y sus derivados (CentOS, por ejemplo).

    
respondido por el Nancy 24.06.2016 - 12:52
fuente
0

Puede restringir a qué directorios pueden acceder las secuencias de comandos PHP usando open_basedir configuración.

por ejemplo poner open_basedir = /var/www/ en su archivo php.ini debe restringir PHP a / var / www /

    
respondido por el OneTimeUser0 24.06.2016 - 13:23
fuente

Lea otras preguntas en las etiquetas