如何以 root 身份运行 PHP exec()?

问题描述 投票:0回答:9

我正在尝试用 PHP 构建一个防火墙管理器,但是当我执行时,

<?php exec('iptables -L'); ?>
,结果数组为空。

我已经尝试过,

<?php echo exec('whoami'); ?>
,响应是
www-data
(Apache正在使用的用户)。我该怎么做才能以 root 身份执行 exec 函数? (最好不要更改 Apache 用户。)

php security unix shell
9个回答
38
投票

别这样做!您将使自己容易遭受各种恶意黑客攻击。

查看“sudo”文档。

您应该能够将所需的所有命令设置为“sudo”脚本。 编写功能有限的特定脚本比暴露要好得多 底层特权命令。

如:

exec ('sudo getIpTables.ksh')

16
投票

我知道这是一个老问题

将用户 php running 添加到 sudo 组(如果尚未分配)

使用 sudo -S,这样你就可以通过 echo 传递密码

$exec = "echo your_passwd | /usr/bin/sudo -S your command";
exec($exec,$out,$rcode);

如果您的路径有问题 - 使用

"bash -lc 'echo your_passwd | /usr/bin/sudo -S your command'"

这样你就得到了一个新的 bash,它的作用类似于登录 shell 并设置了路径

检查 sudo 的手册页


13
投票

您可以通过phpseclib运行sudo,这是一个纯PHP SSH实现:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
$ssh->login('username', 'password');

$ssh->read('[prompt]');
$ssh->write("sudo command\n");
$ssh->read('Password:');
$ssh->write("Password\n");
echo $ssh->read('[prompt]');
?>

4
投票

您可以将所需的命令放在单独的脚本/可执行文件中(sh,PHP,真正的可执行文件,没关系),将其所有者更改为root,然后对其应用“setuid”。

这将允许任何人和任何人以 root 身份运行此脚本,因此您需要确保它有自己的安全规则,以查看是否允许这样做,并且其功能受到严格限制。


3
投票

这是非常不安全的,也是一个坏主意。重新思考你的设计。如果您确实想这样做,请按照建议使用 sudo 。另一种解决方案可能是继续以 root 身份运行,但在 chroot 或 vm 映像内执行此操作(两者都可以打破,但仍然如此)。

或者最好的是在 chroot 中以 sudo 身份运行!


3
投票

除非您使用 suphp 并将其配置为以 root 身份运行,否则您将无法代表运行 PHP 的任何其他系统用户运行任何 PHP 脚本。

编辑:

只是一个小想法。以某种方式添加队列进程并在根的 crontab 中运行 cron 进程。

请务必小心这一点。任何注射都会真正破坏系统。


2
投票

我最近发布了一个项目,允许 PHP 获取真实的 Bash shell 并与之交互。在这里获取:https://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('iptables -L');
//the return will be a string containing the return of the command
echo $return1;

0
投票

我遇到了类似的问题,我需要以

git reset --hard
用户身份从 PHP 脚本执行
www-data
等 Git 命令。以下是我如何在不将 PHP 用户更改为
root
的情况下使其工作:

解决方案: 为 Web 目录设置正确的所有权:

确保

www-data
拥有 Web 目录,因此它具有正确的权限:

chown -R www-data:www-data /var/www

配置 Git 以允许安全目录访问:

这可以确保 Git 在通过 www-data 访问时不会引发权限问题:

git config --global --add safe.directory /var/www

授予

www-data
权限,无需密码即可运行 Git 命令:

要允许

www-data
用户通过 sudo 运行 Git 命令,您可以将以下行添加到 sudoers 文件中。建议为此在
/etc/sudoers.d/
下创建一个单独的文件:

echo "www-data ALL=(ALL) NOPASSWD: /usr/bin/git" | sudo tee /etc/sudoers.d/www-data-git

这确保了

www-data
可以以 root 身份运行 git 命令而无需密码。

使用 sudo 从 PHP 执行 Git 命令:

PHP 脚本中,使用

sudo
执行
git
命令。这是我使用的命令(示例用法)

$strCommand = "echo '' | sudo -S git -C /var/www reset --hard origin/main 2>&1";
exec($strCommand, $output);
echo implode("\n", $output);

echo '' | sudo -S
:这会向 sudo -S 发送一个空密码,因为 sudoers 配置允许 git 命令在没有密码的情况下运行。
git -C /var/www reset --hard origin/main
:这会重置 Git 存储库以匹配远程分支。
2>&1
:重定向输出和错误消息以进行调试。

总结: 通过此设置,我能够使用 sudo 通过 PHP 作为 www-data 运行 Git 命令,而无需将 PHP 用户更改为 root 或为 sudo 提供密码。这是在 Docker 容器内完成的,但它应该可以在管理特定命令的 sudo 权限的类似环境中工作。


-2
投票

只是一个假设 - 这是一个可以执行此操作的 PHP Web 应用程序吗?这听起来不太安全。需要 root 的应用程序 - 您可以单独构建它,然后从 PHP 调用它吗?如果没有,也许您可以 sudo 该进程,以便它可以以 root 身份运行。

© www.soinside.com 2019 - 2024. All rights reserved.