【问题标题】:PHP let www-data run a command as if it were a different userPHP 让 www-data 像其他用户一样运行命令
【发布时间】:2013-11-20 09:45:23
【问题描述】:

所以我想在我的 php 脚本中执行以下命令:

exec("/path/to/command");

因为是 www-data 用户运行 php 脚本,我目前无法运行这个命令。 我读过一些关于 suexec 能够像其他用户一样运行命令的内容。我发现很难理解这是如何工作的。

我已经安装了 suexec 并编辑了 /etc/apache2/suexec/www-data 文件并添加了:

/home/user_to_run_command/script.php

我还编辑了 /etc/apache2/sites-enabled/000-default 并添加了:

SuexecUserGroup user_to_run_command user_to_run_command

我错过了什么吗?

【问题讨论】:

    标签: php apache suexec


    【解决方案1】:

    我遇到了同样的问题,最后找到了一个我认为既安全又简单的解决方案。这种方法的一个缺点是您必须在发布安全更新时注意它们。

    我们要做的是制作我们自己的特殊外壳,我们将其 chown 和 SUID 提供给我们希望执行任务的用户。为了保持安全,这个用户应该只是一个没有广泛系统权限的普通用户,并将脚本放在其他不允许的地方。现在我们让 php 执行一个使用这个特殊 shell 的脚本,并且这个脚本中的所有命令都将作为选择的用户执行。

    在实践中:

    sudo mkdir /usr/lib/specialshell
    sudo chown user_who_may_run_command:root /usr/lib/specialshell
    sudo chmod 700 /usr/lib/specialshell
    sudo cp /bin/perl specialperl
    sudo chown user_to_run_command:usergroup_to_run_command specialperl
    sudo u+s specialperl
    sudo mv specialperl /usr/lib/specialshell
    

    现在我们创建一个名为 command.script 的脚本,其中包含:

    #!/usr/lib/specialshell/specialperl
    $ENV{"PATH"} = "/usr/bin";
    system("/path/to/command");
    

    我们使用的 php 代码:

    exec("/path/to/command.script");
    

    瞧,没有代码变化,只是 php 中的命令名称。

    编辑:仅适用于 perl 作为 shell,因此将 bash 更改为 perl 并将 shell 放在安全的地方

    【讨论】:

      【解决方案2】:

      suEXEC 仅在 PHP 以 CGI 模式执行时有效,但当 PHP 作为 apache2 运行时无效 模块。我猜你是把它作为一个模块来运行的。


      另一种方法可能是将所有权转移给所需的用户,然后设置suid 位:

      chown desired_user your.program
      chmod u+s your.program
      

      现在在执行your.program 时,它具有权限,就好像它由它的所有者执行一样。请关注我链接的 wiki 文章以获取更多信息。

      旁注:这仅适用于二进制文件(不适用于 shell 脚本,因为它们由未设置 suid 位的 shell 二进制文件执行)

      【讨论】:

      • 是的,我认为 php 是作为 www-data 的 apache2 用户运行的,对吗?这就是我在 php 脚本中执行 exec('whoami') 时得到的结果。
      • 您使用的是 CGI 还是 libapache2-mod-php5?
      • suexec 仅适用于 cgi。我建议的解决方法对您有用吗? (取决于你的需要)如果没有,你必须设置一个 cgi 环境
      • 对,我到目前为止所做的是 chown www-data /path/to/command 然后 chmod u+s /path/to/command,这就是你的意思吧?还没给我做。
      • 正如我所说,它只适用于二进制文件。最简单的解决方法是用 C 编写一个包装器
      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2019-11-09
      • 2017-08-23
      相关资源
      最近更新 更多