防止 PHP/Apache 访问站点目录上方的文件

Posted

技术标签:

【中文标题】防止 PHP/Apache 访问站点目录上方的文件【英文标题】:Prevent PHP/Apache from access files above site directory 【发布时间】:2014-02-23 12:04:07 【问题描述】:

我正在使用 Apache 虚拟主机和 suEXEC(Centos 6.5、Apache 2.2.5 和 php 5.3.3)配置多域 Web 服务器。

我想阻止 PHP 访问网站目录上方的文件夹/文件。我将逐步解释我的设置是什么,最后是什么问题。

这是我正在使用的文件夹结构:

/var/www/domain.com/public_html/

在 /var/www/ 里面我有这个:

drwxr-xr-x  2 root    root   4.0K Aug 13 13:30 cgi-bin/
drwxrwxr-x  4 apache  apache 4.0K Jan 28 09:16 site1.com/
drwxrwxr-x  4 apache  apache 4.0K Jan 28 08:44 site2.com/
drwxr-xr-x  4 apache  apache 4.0K Jan 30 11:08 site3.com/

在 /var/www/site1.com/ 内部:

drwxr-xr-x 2 apache apache 4.0K Jan 30 10:16 logs/
drwxr-xr-x 3 user1  user1  4.0K Jan 30 11:08 public_html/

httpd.conf中site1.com的虚拟主机定义为:

<VirtualHost *:80>
    ServerAdmin info@site1.com
    DocumentRoot /var/www/site1.com/public_html
    ServerName www.site1.com
    ServerAlias site1.com
    ErrorLog /var/www/site1.com/logs/error_log
    CustomLog /var/www/site1.com/logs/access_log common

    php_flag log_errors on
    php_flag display_errors on
    php_value error_log /var/www/site1.com/logs/php_errors.log

    <Directory "/var/www/site1.com/public_html">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

    SuexecUserGroup user1 user1
    AddHandler application/x-httpd-php .php
    Action     application/x-httpd-php /cgi-bin/php-cgi

    ScriptAlias /cgi-bin/ /var/www/site1.com/public_html/cgi-bin/
    <Directory "/var/www/site1.com/public_html/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

但是,我编写并执行了这个 php 脚本 (www.site1.com/test.php)

<?php
system("id");
print "<pre>";
system("ls /var/www");
print "</pre>";
?>

我得到:

uid=503(user1) gid=503(user1) groups=503(user1)

site1.com
site2.com
site3.com

这意味着 PHP 可以访问我服务器中的任何文件夹(包括 /etc /var /usr 等)

我想阻止 Apache/PHP 访问 /var/www/site1.com 上方的所有文件夹

我应该如何配置 Apache?

我已经对这个问题进行了广泛的谷歌研究,但我找不到解决方案。

非常感谢。

【问题讨论】:

你不能chmod那些文件夹吗? @BenA.Hilleli 我可以对它们进行 chmod,但 php 仍然可以访问服务器的其余部分,即 /etc 中的任何文件 @Gustavo 你找到解决方案了吗? 不@2Noob2Good,我没有。 【参考方案1】:

在生产环境中运行,你真的应该使用类似的东西:

disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

在您的php.ini 文件中。允许诸如 system 或 exec 之类的东西是一个真正的安全漏洞。

你还想使用类似的东西:

php_admin_value open_basedir /var/www/site1.com/

在您的 Apache vHost conf 中,防止 PHP 越界...

就目前而言,我可以将一个 PHP 文件作为user1 上传到/var/www/site1.com/public_html/attacker.php,其中包含:

<?php
chmod("/var/www/site2.com", 777);
?>

然后,打开我的浏览器并导航到http://site1.com/attacker.php。 Apache 很乐意将它传递给 PHP,运行它,并且由于 Apache 拥有 /var/www/site2.com,它完全能够更改权限。

砰!

user1 现在可以访问/var/www/site2.com/,以及在该计算机上拥有用户帐户的任何其他人。然后它可以劫持网站,创建新文件来托管比特币挖矿业务,出售伟哥等。

注意:即使您相信您的用户不会做任何恶意行为,也不能保证第三方无法访问他们的帐户并执行此类操作。处理它的最佳方法是控制一个被盗用的帐户,这样它就不会对整个系统造成太大的损害。

欲了解更多信息,请查看:

http://php.net/manual/en/ini.core.php#ini.open-basedir https://www.cyberciti.biz/faq/linux-unix-apache-lighttpd-phpini-disable-functions/

【讨论】:

禁用 curl_exec 这样的必要功能为什么?

以上是关于防止 PHP/Apache 访问站点目录上方的文件的主要内容,如果未能解决你的问题,请参考以下文章

Nginx+Php中限制站点目录防止跨站的配置方案记录

lamp-配置防盗链访问控制Directory(针对目录)访问控制(针对单文件)

nginx+php使用open_basedir限制站点目录防止跨站

如何防止从我的角度站点直接访问 bootstrap.min.js?

宝塔面板防恶意解析

Codeigniter 未运行类定义 - PHP 或 Apache 配置问题