猿问
下载APP

通过PHP执行root命令

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


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


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


<?php

exec('/sbin/service sshd restart');

?>

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


我遇到了一些解决方案:


“以root用户运行apache”确实不安全。我不想那样做。

我尝试了“ apache ALL = NOPASSWD:/ sbin / service到/ etc / sudoers”,但是仍然有问题。

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


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


jeck猫
浏览 88回答 3
3回答

慕村225694

在尝试之前,请阅读整个文章,然后进行选择。使用二进制包装器(带有suid位)的解决方案1)创建一个脚本(最好是.sh),其中包含要作为root用户运行的脚本。# cat > php_shell.sh <<CONTENT&nbsp; #!/bin/sh&nbsp; /sbin/service sshd restartCONTENT2)该文件应归root用户所有,因为以后它将以root用户权限运行,因此请确保只有root用户具有写入文件的权限。# chown root php_shell.sh# chmod u=rwx,go=xr php_shell.sh3)要以root用户身份运行脚本,无论执行该脚本的用户是什么,我们都需要一个二进制包装器。创建一个将执行我们的php_shell.sh。# cat > wrapper.c <<CONTENT&nbsp; #include <stdlib.h>&nbsp; #include <sys/types.h>&nbsp; #include <unistd.h>&nbsp; int&nbsp; main (int argc, char *argv[])&nbsp; {&nbsp; &nbsp; &nbsp;setuid (0);&nbsp; &nbsp; &nbsp;/* WARNING: Only use an absolute path to the script to execute,&nbsp; &nbsp; &nbsp; *&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a malicious user might fool the binary and execute&nbsp; &nbsp; &nbsp; *&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arbitary commands if not.&nbsp; &nbsp; &nbsp; * */&nbsp; &nbsp; &nbsp;system ("/bin/sh /path/to/php_shell.sh");&nbsp; &nbsp; &nbsp;return 0;&nbsp; &nbsp;}CONTENT4)编译并设置适当的权限,包括suid位(假设它应以root特权运行):# gcc wrapper.c -o php_root# chown root php_root# chmod u=rwx,go=xr,+s php_rootphp_root现在将以root权限运行,并执行中指定的命令php_shell.sh。如果您不需要轻松更改将要执行的命令的选项,建议您直接在wrapper.c步骤4下编写这些命令。然后,您无需让二进制文件执行外部脚本来执行所讨论的命令。在中wrapper.c,用于system ("your shell command here");指定您要执行的命令。

SMILET

我不会让PHP执行任何sudo命令。对我来说,这听起来像是在自找麻烦。相反,我将创建两个单独的系统。第一个使用PHP(网络层)的系统将处理用户请求。当发出需要sudo命令的请求时,我会将这个请求放在某个队列中。这可能是某种数据库或中间件数据库,例如ZeroMQ。第二个系统(业务层)将从该队列中读取或接收消息,并且具有执行sudo命令的能力,但不属于Web服务器进程的范围。我知道这有点含糊,可以使用各种技术以不同的方式解决,但我认为这是最好,最安全的方法。

湖上湖

使用二进制包装程序(带有suid位)的解决方案FilipRoséen的 一些修改-refp post。要执行任何修改过的wrapper.c命令#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <string.h>int main (int argc, char&nbsp; **argv){&nbsp;setuid (0);&nbsp;char cmd[100] = "";&nbsp;int i;&nbsp;char *p;&nbsp;for(i=0; i < argc; i++) {&nbsp; &nbsp; if(i != 0){&nbsp; &nbsp;strcat(cmd, *(argv+i));&nbsp; &nbsp;strcat(cmd, " ");&nbsp; &nbsp; }&nbsp;}&nbsp;system (cmd);&nbsp;return 0;&nbsp;}编译并设置适当的权限;&nbsp; gcc wrapper.c -o php_root&nbsp; &nbsp; &nbsp;# php_root can be any name.&nbsp; chown root php_root&nbsp; chmod u=rwx,go=xr,+s php_root现在从PHP调用。执行任何命令。&nbsp;shell_exec('./php_root '.$cmd);//execute from wrapper
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答