通过 PHP 执行根命令

2022-08-30 10:03:36

我有一个 CentOS 5.7 Linux 服务器,并使用 php5.3.x。

在 pfSense 系统上,您可以使用 php 网页重新启动需要 root 权限的服务。

我正在尝试做类似的事情,我已经编写了一些php代码来执行shell命令。例如,要重新启动 sshd 服务,请执行以下操作:

<?php
exec('/sbin/service sshd restart');
?>

我试图通过exec函数执行该命令,但它需要root权限,但我们有一个apache用户权限。

我遇到了一些解决方案:

  1. “使用root用户运行apache”确实不安全。我不想那样做。
  2. “apache ALL=NOPASSWD:/sbin/service to /etc/sudoers”我试过了,但仍然有问题。

还有其他解决方案吗?感谢您的回答。


现在。。这很有趣。我尝试@refp帖子,它工作了我的本地ubuntu服务器。但是当我在我的cenOS vps服务器上尝试相同时。它不起作用,这是apache的错误日志“rm:无法删除'/var/lock/subsys/vsftpd':权限被拒绝”


答案 1

在尝试之前,请先阅读整篇文章,并做出选择。


使用二进制包装器(带 suid 位)的解决方案

1)创建一个脚本(最好是),其中包含要以root身份运行的内容。.sh

# cat > php_shell.sh <<CONTENT
  #!/bin/sh
  /sbin/service sshd restart
CONTENT

2)此文件应由root拥有,并且由于它稍后将使用root权限运行,因此请确保只有root才具有写入该文件的权限。

# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh

3)要以root身份运行脚本,无论哪个用户执行它,我们都需要一个二进制包装器。创建一个将执行我们的.php_shell.sh

# cat > wrapper.c <<CONTENT
  #include <stdlib.h>
  #include <sys/types.h>
  #include <unistd.h>

  int
  main (int argc, char *argv[])
  {
     setuid (0);

     /* WARNING: Only use an absolute path to the script to execute,
      *          a malicious user might fool the binary and execute
      *          arbitary commands if not.
      * */

     system ("/bin/sh /path/to/php_shell.sh");

     return 0;
   }
CONTENT

4)编译并设置适当的权限,包括suid位(说它应该以root权限运行):

# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root

php_root现在将使用 root 权限运行,并执行 中指定的命令。php_shell.sh


如果您不需要选择轻松更改将要执行的命令,我建议您直接在步骤4下编写命令。然后,您不需要让二进制文件执行执行相关命令的外部脚本。wrapper.c

在 中,用于指定要执行的命令。wrapper.csystem ("your shell command here");


答案 2

我不会让PHP执行任何sudo命令。对我来说,这听起来像是在自找麻烦。相反,我会创建两个独立的系统。

第一个系统,在PHP(Web层)中,将处理用户请求。当发出需要 sudo 命令的请求时,我会将此请求放在某个队列中。这可能是某种类型的数据库或中间件,例如ZeroMQ。

第二个系统(业务层)将从此队列读取或接收消息,并且能够执行 sudo 命令,但不在 Web 服务器进程的范围内。

我知道这有点模糊,可以通过各种技术以不同的方式解决,但我认为这是最好和最安全的方式。


推荐