使用PHP执行命令:使用普通用户,但其主目录是/root

使用PHP执行命令:使用普通用户,但其主目录是/root

我正在使用 Apache + PHP 的自定义编译安装,监听端口80

Apache 配置为以普通用户身份运行,并具有正确的设置UserGroup文件httpd.conf

将 apache 作为服务运行后,apachectl有一个进程httpd由 root 运行,另外 4 个进程由该普通用户运行。

问题是这样的:

  • 当我通过 PHP 运行外部命令(例如使用execpassthru)时,它是由正确的普通用户运行的,但$HOME环境变量指向/root.

例如,使用以下非常简单的代码:

<?php
echo "Home: " . `echo \$HOME`;
echo "<br />";
echo "Id: " . `id`;

我得到:

Home: /root
Id: uid=1000(normaluser) gid=100(users) groups=100(users),17(audio),33(video)

以这种方式运行的任何命令实际上都是由普通用户运行的,因此不存在安全问题。主要问题是当运行外部命令时,该命令尝试从主目录写入和/或读取某些内容。

答案1

我希望它只读取由任何 shell 启动(Apache 进程)echo $HOME设置的环境变量。httpd除非有什么事情发生export HOME=/home/whatever,否则环境变量 HOME 的值将保持不变。

我不确定你的最后一段是否正确。只要没有安全问题,是否PATH设置为normaluser?如果 /home/normaluser/bin 包含一个非常特殊的ls可执行文件,它可以执行不寻常的操作,例如生成系统上任何文件的可下载 HTTP 输出,该怎么办?在我的 Apache/PHP 设置中, /usr/local/bin:/bin:/usr/bin:/u/bediger/binPHP 程序的PATH 设置为。

您关于主要问题的断言,即从主目录中读取/写入某些内容,也没有意义。 HOME 的值对于部分限定文件名并不重要,当前工作目录很重要。httpd似乎为我的测试 PHP 程序设置正确。我的 Apache/PHP 设置将当前工作目录设置为文档根目录,这是我的 PHP 所在的位置。

<html>
<head><title>Test</title></head>
<body>
<p>
<?php
    echo "Home: " . `echo \$HOME`;
    echo "<br />";
    echo "Id: " . `id`;
    echo "<br />";
    echo "PWD: " . `pwd`;
    echo "<br />";
    echo "PATH: " . `echo \$PATH`;
?>
</p>
</body>
</html>

相关内容