这看起来很奇怪,我在 CentOS 机器中有一个 apache httpd 服务器,它存在这个安全问题:
虚拟主机已启用,站点位于 /data/www/vhost2/index.php 看起来,如果我告诉 index.php 在 ../../ 中查找文件(因此它退出 www 目录),它就会看到它!我如何阻止 php 查看此目录之外的内容?我必须使用 basedir 吗?虚拟主机呢,是否可以以类似沙盒的方式对每个文件夹执行此操作?
谢谢
答案1
黑客通常使用符号链接绕过 open_basedir。我的服务器多次被黑客利用。最好的方法是安装 Suhosin 并禁用符号链接等潜在危险功能。以下是安装教程的链接,可能比较旧,但可能有用
http://www.webhostgear.com/416.html
然后使用 php.ini 中的以下指令阻止以下函数
suhosin.executor.func.blacklist = "show_source,shell_exec,passthru,exec,popen,system,system, shell_exec, passthru, exec, popen, proc_open, symlink, php_uname,etmyuid,passthru,leak,listen,diskfreespace,link,ignore_user_abord,shell_exec,dl,exec,highlight_file,source,show_source,fpaththru,virtual,posix_ctermid,posix_getcwd,symlink,popen,system,escapeshellarg,escapeshellcmd,myshellexec,c99_buff_prepare,c99_sess_put,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate"
答案2
对于未配置和未强化的系统,这是正常行为,您可以简单地设置open_basedir
选项来php.ini
定义限制(http://www.php.net/manual/en/ini.core.php#ini.open-basedir)。
但它不会限制exec
从 php 脚本运行的 shell 脚本和命令访问这些文件,您可以使用 禁用其中一些功能disable_functions
。
一般来说,强化方面有很多东西,在这里列出来并不容易,而且是架构方面的。例如,目前,我猜你正在运行带有 mod_php 的 apache prefork MPM,如果是 mod_fcgid + php-cgi - 你将根本无法使用/data
,因为它受到 mod_fcgid 的限制,此外,默认策略还/var/www/
存在 selinux 限制等。targeted
你会发现越来越多这样的问题。
答案3
如果你配置了许多虚拟主机,你可以设置 php_admin_value open_basedir /path_to_the_virtual_root,这样你就可以通过虚拟主机设置 open_basedir