0

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

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

因为运行 php 脚本的是 www-data 用户,所以我目前无法运行此命令。我读过一些关于 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

我错过了什么吗?

4

2 回答 2

0

suEXEC 仅在 PHP 以 CGI 模式执行时才起作用,但如果 PHP 作为 apache2 模块运行则不起作用。我猜你正在将它作为一个模块运行。


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

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

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

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

于 2013-11-08T11:40:15.163 回答
0

我遇到了同样的问题,最后找到了一个我认为既安全又简单的解决方案。此方法的一个缺点是您必须在发布安全更新时对其进行处理。

我们要做的是制作我们自己的特殊外壳,我们将其 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 放在安全的地方

于 2013-12-28T19:56:03.977 回答