Apache 能够在 Web 服务器根目录之外执行文件
Posted
技术标签:
【中文标题】Apache 能够在 Web 服务器根目录之外执行文件【英文标题】:Apache able to execute file outside web server root directory 【发布时间】:2012-06-30 20:44:50 【问题描述】:我在我的 Mac 上安装了 XAMP,我尝试运行命令 -
ps axo user,group,comm | grep httpd
知道 apache 正在以什么用户身份运行。
我得到了多个结果,一个是root,另一个是nobody。那么 apache 是作为什么运行的呢?一个root或nobody,为什么我得到root和nobody?是不是因为httpd一开始是root,后来变成nobody了?
ps axo user,group,comm | grep httpd
我得到的结果是 -
其次,当我执行以下脚本时 -
echo shell_exec('whoami');
(来自https://***.com/questions/2509334/finding-out-what-user-apache-is-running-as)
我得到的结果是 - nobody
我想知道用户的原因是因为 php 引擎实际上能够执行 web 服务器根目录之外的 php 文件(mysql_details.php)。而这个 mysql_details.php 具有以下权限 - rwxr--r--
即仅读取其他和组的权限。所以如果apache用户是nobody,那么它如何执行mysql_details.php。
谢谢, 普拉特。
【问题讨论】:
权限问题我无法回答,但我会说目标可执行文件在文件系统中的位置无关紧要,这里只有权限。目标可执行文件位于 DocRoot 之外这一事实与 PHP 是否可以访问它没有关系,除非您应用 chroot 这是否意味着phpengine可以执行文件系统中的任何文件,如果它设置了可执行位? 如果 PHP 可以命名文件(参见 chroot 链接)并且可执行位设置为 world、PHP 用户所属的组或所有者并且 PHP 用户拥有脚本,那么可以。文件系统位置对此规则没有影响 【参考方案1】:主 Apache 进程以 root 身份运行 - 其他进程以无人身份运行。处理请求的唯一进程是那些以无人身份运行的进程,因此,如果有人试图访问无人无法访问的文件,他们将收到错误消息(而 root 可以访问该文件)。
如果需要执行文件,可以做几件事:
-
没有人拥有该文件。这将使任何人都无法完全读取/写入/执行文件,同时阻止其他用户写入或执行文件。
将nobody 添加到组,并授予该组对该文件的执行权限。该组中的任何人都可以执行该文件,但只有所有者才能对其进行写入(不会是任何人)。
允许任何人执行该文件。这可能不是一个好主意,因为任何用户都可以在不同的权限级别上执行内容。最好使用上述两种中的一种。
【讨论】:
我同意你的分析。但我的问题是,文件 mysql_details.php 仅对其他人具有读取权限,但考虑到它是以无人用户身份运行的,apache 为何能够执行它。 @Prat 似乎 PHP 需要的只是读取文件的权限才能执行它。 ***.com/questions/2010623/…谁能想到?由于该文件的权限允许任何人读取它,因此没有人可以读取该文件并执行它。 @drderp 那是因为 PHP 是一种解释性语言,而且 PHP 脚本本身是不可执行的,除非它们有一个 shebang。很像 shell 脚本 - 你可以在没有 exec 权限的情况下执行sh script.sh
,但除非你拥有它们,否则你不能执行 ./script.sh
。
@DaveRandom 我知道,我花了几分钟查了一下。
谢谢 Drderp。这正是我想要的。以上是关于Apache 能够在 Web 服务器根目录之外执行文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的计算机上运行 htdocs 目录之外的 PHP 文件?
eclipse Dynamic web project 工程目录