通过PHP执行root命令

Meh*_*NCE 53 php apache permissions root

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

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

我正在尝试做类似的事情,我已经写了一些PHP代码来执行shell命令.例如,要重新启动sshd服务:

<?php
exec('/sbin/service sshd restart');
?>
Run Code Online (Sandbox Code Playgroud)

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

我遇到了一些解决方案:

  1. "用root用户运行apache"真的不安全.我不想那样做.
  2. "apache ALL = NOPASSWD:/ sbin/service to/etc/sudoers"我试过但仍然有问题.

还有其他方法吗?谢谢你的回答.


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

Fil*_*efp 91

在尝试之前阅读整篇文章,可以做出选择.


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

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

# cat > php_shell.sh <<CONTENT
  #!/bin/sh
  /sbin/service sshd restart
CONTENT
Run Code Online (Sandbox Code Playgroud)

2)此文件应由root拥有,并且由于它稍后将以root权限运行,因此请确保只有root有权写入该文件.

# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root
Run Code Online (Sandbox Code Playgroud)

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


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

wrapper.c,用于system ("your shell command here");指定您要执行的命令.

  • 这就像创建一个 rootkit 将其放置在您自己的系统中,然后等待有人查看 php 源代码并触发任何命令来直接访问您的 Linux 系统。 (3认同)

Luk*_*uke 23

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

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

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

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


har*_*rry 8

允许www-data用户运行以运行没有密码的program1和program2:

sudo visudo
Run Code Online (Sandbox Code Playgroud)

添加到sudoers文件的内容:

User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS
Run Code Online (Sandbox Code Playgroud)

保存.

来自https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root


sha*_*779 5

使用二进制包装器(带有 suid 位)的解决方案Filip Roséen 的 一些修改- refp帖子。

执行任何命令修改wrapper.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main (int argc, char  **argv)
{
 setuid (0);
 char cmd[100] = "";
 int i;
 char *p;
 for(i=0; i < argc; i++) {
    if(i != 0){
   strcat(cmd, *(argv+i));
   strcat(cmd, " ");
    }
 }

 system (cmd);

 return 0;
 }
Run Code Online (Sandbox Code Playgroud)

编译并设置适当的权限;

  gcc wrapper.c -o php_root     # php_root can be any name.
  chown root php_root
  chmod u=rwx,go=xr,+s php_root
Run Code Online (Sandbox Code Playgroud)

现在从 PHP 调用。执行任何命令。

 shell_exec('./php_root '.$cmd);//execute from wrapper
Run Code Online (Sandbox Code Playgroud)