2012-05-14 12 views
6

Tenemos una aplicación IRC de Java donde los usuarios pueden ejecutar PHP arbitrario y obtener el resultado. Aquí está un ejemplo de lo que este se utiliza para:código arbitrario de encarcelamiento PHP

btc: <php>$btc = json_decode(file_get_contents('https://btc-e.com/api/2/1/ticker'), true); $ticker = $btc['ticker']; echo "Current BTC Ticker: High: $".$ticker['high']." Low: $".$ticker['low']." Average: $" . $ticker['avg']; 

También tenemos una configuración pitón, pero nos gusta porque PHP PHP no requiere nuevas líneas en el código en cualquier lugar. (Debido a que este es el IRC, no podemos damos saltos de línea a menos que Exec un archivo .py cargado web)

La cuestión es cómo evitar que la gente tratando de explotar el sistema, como por ejemplo en:

<php>echo readfile("/etc/passwd"); 

Lo cual, claramente, leerá el archivo de contraseña para que todos lo vean.
También estamos teniendo este problema, después de que hemos tratado de bloquear readfile():

<php>$rf = readfile; echo $rf("/etc/passwd"); 

¿Cómo deberíamos ir sobre la seguridad de este sistema? (El código completo está en github, para cualquier interesado: https://github.com/clone1018/Shocky)

Como un lado, no se está exponiendo información realmente sensible, ya que todo está en una máquina virtual, por lo que no es una "bomba de tiempo" ni nada . Sin embargo, todavía queremos bloquearlo.

+7

¿Por qué su servidor web tiene los derechos para leer '/ etc/passwd'? Bloquee a su usuario web para empezar. – afuzzyllama

+1

@afuzzyllama Eso no tiene nada que ver con el usuario de la web; '/ etc/passwd' es legible en todo el mundo por defecto en la mayoría de las distribuciones de Linux.Algunos programas requieren acceso a ese archivo para funcionar, y de todos modos no contiene contraseñas. –

+0

@Ryan P - Por "usuario web" me refiero al usuario que ejecuta Apache, no al usuario en el sitio web. – afuzzyllama

Respuesta

4

Eso suena como tapar un agujero en un colador. La seguridad del sistema de archivos debe ser manejada por el sistema operativo, no por la aplicación. Y en cuanto va /etc/passwd, el sistema operativo ya lo está asegurando.

Esta es la primera línea de mi /etc/passwd - Sí, voy a publicar en público:

root:x:0:0:root:/root:/bin/bash 

Por lo general, las contraseñas no se almacenan realmente en /etc/passwd. La información del usuario es, pero las contraseñas se reemplazan por x, con la contraseña real solo disponible para el usuario raíz.

Sin embargo, debe bloquear PHP hasta cierto punto. Puede cambiar muchas opciones de PHP durante el tiempo de ejecución con ini_set, incluido open_basedir. http://www.php.net/manual/en/ini.core.php#ini.open-basedir

+0

Aceptando porque esto es algo que no hemos hecho. – Riking

+0

** @ Ryan P: ** Eso todavía no está solucionando el problema de raíz, si hacemos eso, aún podrían '$ a = 'incluir'; $ a ('sql.php'); 'o similar. ** @ afuzzyllama: ** Eso también evita el problema raíz,/etc/passwd fue solo un ejemplo. Incluso si el usuario estuviera en un entorno chrooted, aún podría acceder a los otros archivos en esa cárcel, no queremos eso. – clone1018

+0

Si configura 'open_basedir' en un directorio sin archivos, no podrá abrir nada más que el script en ejecución. El método utilizado para abrir el archivo es irrelevante; también afecta 'include'. –

-4

Si sólo desea restringir el archivo de lectura tal vez esto puede ayudar http://www.php.net/manual/en/ini.core.php#ini.open-basedir

Si está utilizando una versión antigua de php < 5.4 puede considerar usar el modo seguro de PHP

http://php.net/manual/en/ini.sect.safe-mode.php

Establezca los siguientes vars para modo seguro para restringir php

safe_mode_exec_dir 
disable_functions = readfile,system 

y muchos otros

Además, el usuario no podrá leer ningún archivo cuyo uid sea diferente, p./etc/contraseña. Tenga en cuenta que el modo seguro se deprecia/elimina de las últimas versiones de php

+1

No debe sugerirle a nadie que use una funcionalidad en desuso, especialmente cuando se ha eliminado en la versión actual. –

+0

Booo dijo que el viejo sabio :-P. En este caso, para este caso de uso particular, el modo seguro parece ser la mejor opción, incluso si se depreció, que una falta de respuesta del viejo sabio (que ni remotamente trata de tocar la solución a las preguntas, pero aún obtiene +2) – APZ

+0

La solución a un problema y la respuesta a una pregunta no son lo mismo. Intento dar soluciones a los problemas en lugar de contestar preguntas ciegamente, ya que el primero a menudo es preferible al segundo. –