pow*_*tac 5 php debian shell execution apache-2.2
我有一个由 HTTP 调用的 PHP 脚本,而不是作为命令行脚本。此脚本应以当前网络服务器用户 www-data 以外的其他用户身份调用 shell 命令。
例子:
<?php
echo shell_exec('sudo -u myusername -S /usr/bin/whoami'); // returns nothing :(
echo shell_exec('whoami'); // returns www-data
Run Code Online (Sandbox Code Playgroud)
当调用这 2 个命令sudo -u myusername -S /usr/bin/whoami并whoami直接在命令行上它们返回时
myusername
www-data
Run Code Online (Sandbox Code Playgroud)
也没有结果:
<?php
echo shell_exec('echo "mypass" | sudo -u myusername -S /usr/bin/whoami');
Run Code Online (Sandbox Code Playgroud)
对我来说,sudo 似乎根本无法与 PHP 的 shell_exec() 一起使用。
首先,我不明白您正在运行的 sudo 命令。 sudo -u username应该允许您作为用户一,以用户二的身份执行命令,说(在本例中,作为用户一,运行命令 ls):
sudo -u usertwo ls
Run Code Online (Sandbox Code Playgroud)
如果您尝试通过替换username真实用户名来清理上面的命令,我深表歉意,但我不能确定您已经这样做了,所以我需要先提出这一点。
其次,必须配置 sudo 以让用户以另一个用户的身份执行一系列命令。让我们首先允许 www-data 作为用户 fribble sudo ls 命令;你可以通过放置来测试这个
www-data ALL = (fribble) NOPASSWD: ls
Run Code Online (Sandbox Code Playgroud)
在您的 sudoers 文件中(将真实用户替换为 fribble)。然后尝试ls -la /tmp从您的 PHP 脚本内部执行操作,看看您是否获得了目录列表。
我同意 James Lawrie 的观点,允许 www-data 用户以任意用户的身份无密码地 sudo 任意命令并不是一个好主意,但是如果您阐明要让 www-data 运行的命令,这可能是一个明智的方法来做到这一点。
编辑:
您已经尝试在 sudoers 文件和sudo -u user2 ls -al /tmpPHP 脚本中使用 ls ,并且您得到了一个目录列表,这强烈表明 sudo 可以很好地与 PHP 配合使用。
可以肯定的是,您能否允许/bin/touch在 sudoers 文件中放入sudo -u user2 touch /tmp/TESTFILEPHP 脚本,然后执行它?如果/tmp/TESTFILE出现一个属于 user2的文件,我们可以确定 sudo 和 PHP 一起工作正常。
我必须承认,如果我知道你在尝试 sudo java,我永远不会回答最初的问题,因为我认为 java 是一个巨大的不可预测的垃圾袋,如果它没有得到它需要的环境(并且 sudo 相当严格地消毒环境)。但至少上面的测试应该可以帮助您确定,无论这里的问题是什么,这都不是 PHP 和 sudo 不能很好地协同工作的问题。
不允许网络服务器用户 sudo 访问,你只是自找麻烦。相反,请查看 setuid 位:
chmod u+s some_file_that_needs_executing_as_another_user.pl
每当执行该文件时,它都会由创建它的用户有效地执行。
附带说明一下,我很确定您无法将密码通过管道传输到 sudo 或 passwd 中。
| 归档时间: |
|
| 查看次数: |
26320 次 |
| 最近记录: |