您有一个由 root 拥有的文件。您显然需要找到一种方法将文件标记为您可以修改;或一种让您提升权限的方法,以便您可以修改它。
这导致了两种传统的 Unix 方法来执行此操作。他们是:
创建一个用来标记文件的组,即。初始化调试;chgrp/chmod 文件,使其具有 initdebug 组并且是组可写的;并且,将自己添加到 initdebug 组,以便您可以使用组写入权限来修改文件。
要创建一个非常小的、经过审计的二进制可执行文件(这不适用于脚本),它将执行您想要的特定修改(为简单起见,我建议将选择的 root 拥有的 PHP ini 文件之一复制到正确的位置)。然后 chown'ing 文件,使其归 root 所有,并在可执行文件上设置 suid 位,使其以 root 身份执行。
您还可以结合使用这两种方法:
不要让自己成为可执行文件的 initdebug 组或 suid 的成员,而是将可执行文件的组设置为 initdebug 并设置其 sgid 位;或者,
保留可执行的 suid 根目录,但使其只能由 initdebug 执行,因此只能由添加到该组的用户执行。
如果有人入侵您的帐户,则安全权衡在于特权升级的便利性/风险。如果可执行文件中存在堆栈/堆溢出或类似漏洞并且它以 root 身份执行,那么你就走了。如果可以修改 PHP ini 文件以打开远程漏洞,那么如果他们可以直接访问 ini 文件,那么你就走了。
正如我怀疑后者是可能的,你可能最好使用一个小的可执行文件。
注意:正如我在上面提到的,unix 不承认脚本上的 s[ug]id 位(定义为使用 #!... 解释器语法的任何内容)。因此,您将不得不使用可以编译成二进制文件的东西。所以这可能意味着 C、C++、Java(使用 gcj)、ML、Scheme(mit)、Haskell(ghc)。
如果您之前没有进行过任何 C 或 C++ 编程,我会推荐其中一个,因为 suid 二进制文件不是学习 C/C++ 的项目。如果您不了解任何其他语言,我会推荐 ML 或 Java,因为它们是最容易编写小而简单的东西的。
(顺便说一句,http ://en.wikipedia.org/wiki/List_of_compilers包括您可以使用的替代编译器列表。只要确保它编译为本机,而不是字节码。就操作系统而言,字节码 vm 只是另一个口译员)。