在更大的努力的背景下,我遇到了令我困惑的特定问题.
在Mac OS X 10.6.7上,使用Apache和PHP提供的系统,我创建了一个简单的HelloWorld.PHP脚本,毫不奇怪,只需打印Hello,World!没有别的.
如果我执行它作为PHP helloworld.PHP工作正常.
但是,如果我:
sudo su su _www PHP helloworld.PHP
它什么都不发; PHP几乎立即返回,没有任何执行迹象.
我在哪里脱轨(更重要的是,我应该收集哪些诊断信息来帮助推断问题)?
没有骰子.
bash-3.2$ls -alF foo.PHP -rw-r--r-- 1 _www _www 37 Apr 4 21:08 foo.PHP bash-3.2$ls -dalF . drwxr-xr-x 56 _www _www 1904 Apr 4 21:08 ./ bash-3.2$whoami bbum bash-3.2$PHP foo.PHP Hello,World! bash-3.2$sudo sh sh-3.2# PHP foo.PHP Hello,World! sh-3.2# su _www PHP foo.PHP sh-3.2#
如果我将foo.PHP复制到我的Web服务器的文档根目录,它就可以了.就像我在用户的docroot中一样;无论位置如何,它都可以通过网络服务器执行.
甚至su _www PHP -v也没有发现任何东西.这里有点腥.
DERP. _www用户刚被破坏;没有壳.从shell尝试时,即使是最简单的命令也会搞砸.
这与我的问题
“Run cgi-script on commandline as user www?”(FreeBSD)非常相似.
问题在于:用户’_www’的shell设置为/usr/bin/false.根据联机帮助页“虚假实用程序始终以非零退出代码退出.” su _www将永远失败,按设计.
这是出于安全原因.如果有人能够成功运行针对_www(用于运行您的Web应用程序的帐户)的远程攻击,那么他们将遇到一个立即退出的shell.如果这个shell留下类似于/ bin / sh的东西,那么_www用户就可以在命令行上运行许多命令,这对安全性来说是不利的.因此,它设置为/usr/bin/false以限制因您的网络服务器遭受任何妥协而造成的损害.禁用它是不明智的.
但是,将_www shell设置为/usr/bin/false也意味着用户’_www’无法在命令行上执行命令.即使像whoami这样简单的命令也会失败:
# su _www whoami # echo $? 1
解决方案是使用sudo,而不是su.这个简单的例子表明我现在可以执行简单命令,如用户’_www’:
# sudo -u _www id uid=70(_www) gid=70(_www) groups=70(_www)