¿Puedo limitar PHP include () a árboles de directorios específicos?

5

Sé que puedo usar la directiva php.ini open_basedir para limitar los árboles de directorios donde PHP puede abrir archivos.

Pero en una estructura de directorios como esta:

├── application
│   ├── index.php
│   └── www
├── logs
└── uploads
    └── malicious.php.jpg

¿Hay alguna forma de evitar que malware.php.jpg se evalúe como PHP si se especificó en un include() , sin evitar que PHP lea / escriba las cargas en ese directorio?

Editar: Probablemente debería especificar que estoy interesado en una solución basada en configuración o permisos.

    
pregunta Aaron Adams 31.10.2013 - 16:06
fuente

3 respuestas

3

Dependiendo de su configuración, es posible que pueda usar el Control de acceso obligatorio para acercarse a lo que desea. Por ejemplo, considere un sistema que ejecuta linux con apparmor. Al utilizar apparmor, puede limitar qué secuencias de comandos pueden acceder al directorio de subidas. Esta no es una solución perfecta ya que un par de scripts aún podrán "incluir" los archivos, pero puede limitar la cantidad de scripts que pueden.

Por ejemplo, podría permitir que upload.php acceda al directorio de subidas, pero le niegue el acceso a index.php a ese directorio aunque se estén ejecutando como el mismo usuario.

Supongo que puedes hacer cosas similares con otros sistemas MAC como SELinux.

    
respondido por el Daniel 31.10.2013 - 17:24
fuente
3

Esto no se puede hacer sin modificar el comportamiento predeterminado de la familia de funciones include() editando el código fuente de PHP y compilando sus propios binarios. Pero, para ser honesto, esto es un poco inútil. Para que malicious.php.jpg sea includ ed, necesita una vulnerabilidad de inclusión de archivos en su código, algo como include($_GET['file']) .

Lo siguiente mejor es tener todos sus elementos incluidos utilizando la función de inclusión global que ejecuta ciertas validaciones de entrada. Esa función puede controlar a qué directorios se puede acceder.

    
respondido por el Adi 31.10.2013 - 17:31
fuente
1

No, en realidad no. La única forma de hacerlo es limitar los archivos que PHP puede leer a nivel de sistema operativo. Incluso si logró restringir de alguna manera las rutas que podrían leerse con include() o require() , todavía no está impidiendo la ejecución: la secuencia de comandos podría usar la funcionalidad normal fopen() para leer el archivo y luego solo eval() , con exactamente el mismo efecto.

Pero si el código tiene la libertad de hacer todo eso, entonces la inclusión del archivo es la menor de sus preocupaciones. De hecho, la inclusión de archivos maliciosos ni siquiera debería ser posible si escribes tu código correctamente. En ningún momento debería (nunca, nunca ) incluir o ejecutar un archivo si el nombre se originó en las entradas del usuario. Si estás haciendo eso, puedo afirmar categóricamente que lo estás haciendo mal.

Pero si desea limitar el rango de archivos que se pueden incluir / ejecutar / leer, entonces chroot es donde está. Un poco incómodo de configurar, pero ofrece el nivel de protección requerido.

    
respondido por el tylerl 01.11.2013 - 08:49
fuente

Lea otras preguntas en las etiquetas