让PHP以ROOT权限执行系统命令的方法

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考。
其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑,
使得这个问题解决起来麻烦了好多。先来看一个网友使用popen()函数的例子。
复制代码 代码如下:

/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 louis。仅供参考
*/
$sucommand = "su root --command";
$useradd = "/scripts/demo/runscripts.php";
$rootpasswd = "louis";
$user = "james";
$user_add = sprintf("%s %s",$sucommand,$useradd);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);

经过自己的测试,证实此段代码是不能实现(至少在我的系统里是这样的)作者想要获得的结果的。经过自己很长时间的google之后,
问题的关键是su root这个命令需要的密码必须以终端的方式输入,不能通过其它的方式(我也不知道还有没有其它的方式)获得。
又由于项目要求不能使用类似于sudo这种应用,无奈之下,我选择了网友提出的用编写C程序的方法来解决此问题。
首先写个C程序,命名为:run.c 放在目录/scripts/demo/下
复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
//char cmd[1024]; //变量暂时未使用
uid = getuid() ;
euid = geteuid();
printf("my uid :%u\n",getuid()); //这里显示的是当前的uid 可以注释掉.
printf("my euid :%u\n",geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror("setreuid");
printf("after setreuid uid :%u\n",getuid());
printf("afer sertreuid euid :%u\n",geteuid());
system("/scripts/demo/runscripts.php"); //执行脚本
return 0;
}

编译该文件:
gcc -o run -Wall run.c
在该路径下生成run文件,这个可执行文件。如果现在用PHP脚本调用 该run的话,即使setreuid了 也是不行的。
接下来要做的是:给run赋予suid权限
# chmod u+s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
好了,已经设置上了,再写一个php页面调用它。
复制代码 代码如下:

<?php
echo '<pre>';
$last_line = system('/scripts/demo/run', $retval);
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

在浏览器中浏览。
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48

--------------------------------------------------------------------------------
Last line of the output: afer sertreuid euid :48
--------------------------------------------------------------------------------
Return value: 0
该命令执行成功。
从显示结果可以看出: apache(daemon)的uid 为48(事实上很多linux系统下daemon的uid为2)。
调用setreuid后将有效用户id和实际用户id互换了。(必须在chmod u+s生效的情况下) 使apache当前的uid为0这样就能执行root命令了。
只需要更改 C文件中的system所要执行的命令就可以实现自己的PHP以root角色执行命令了。

在玩C 以前 玩过一段时间的PHP, 哪个时候需要用PHP 来运行root命令,一直未果,直到有一天搜索到了super这个插件.
随着玩C的日子多了.发现可以用C语言来包裹 要运行的外部命令. 实验了一下.成功了.
不需要任何外部工具就可以实现用PHP 执行root命令.
我下面就把方法发布给大家,有需求用php来运行root命令的朋友可以不用发愁了.
平台:Linux. 实验命令iptables 当前的目录是/var/www/html/http
写程序的时候 用root用户
大家都知道iptables 非root用户不能运行.
首先写个C程序
命名为:ipt.c
复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
uid = getuid() ;
euid = geteuid();
printf("my uid :%u\n",getuid()); //这里显示的是当前的uid 可以注释掉.
printf("my euid :%u\n",geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror("setreuid");
printf("after setreuid uid :%u\n",getuid());
printf("afer sertreuid euid :%u\n",geteuid());
system("/sbin/iptables -L"); //执行iptables -L命令
return 0;
}

编译该文件 gcc -o ipt -Wall ipt.c
在该路径下生成ipt 这个可执行文件.
如果现在用PHP网页调用 该ipt的话,即使setreuid了 也是不行的.
接下来要做的是chmod u+s ./ipt
ls 一下
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s位已经设置上了.
再写一个php页面调用它.
复制代码 代码如下:

<?php
echo '<pre>';
$last_line = system('/var/www/html/http/ipt', $retval);
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

在浏览器中浏览.

Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48

--------------------------------------------------------------------------------
Last line of the output: afer sertreuid euid :48
--------------------------------------------------------------------------------
Return value: 0

该命令执行成功..
众所周知: apache的uid 为48. 调用setreuid后 将有效用户id 和实际用户id互换了.(必须在chmod u+s生效的情况下) 使apache当前的 uid为0 这样就能执行root命令了。

大家只需要更改 C文件中的 system所要执行的命令就可以实现自己的PHP执行root命令了.

时间: 2024-09-10 02:43:41

让PHP以ROOT权限执行系统命令的方法的相关文章

让PHP以ROOT权限执行系统命令的方法_php技巧

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考. 其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑, 使得这个问题解决起来麻烦了好多.先来看一个网友使用popen()函数的例子. 复制代码 代码如下: /* PHP中如何增加一个系统用户 下面是一段例程,增加一个名字为james的用户, root密码是 louis.仅供参考 */ $sucommand = "su root --comman

linux中php使用root权限执行shell脚本

今天晚上:19:30分,这个困扰了我好久的问题终于解决,其中的原理也终于弄清楚了,总之是利用sudo来赋予Apache的用户root的执行权限,下面记录一下: 利用php利用root权限执行shell脚本必须进行以下几个步骤:(所有步骤都是我亲自实验,若有不妥可指出,谢谢!) 1. 确定一下你的Apache的执行用户是谁.注:不一定就是nobody,我自行安装的httpd,我的Apache的用户就是daemon 2. 利用visudo为你的Apache执行用户赋予root执行权限,当然还有设置无

安卓手机root权限获取与取消方法

安卓手机获取root权限方法 1.百度一键root 1搜索百度一键root,然后下载安装 2.安装完成后打开百度一键root 3.用USB线将手机和电脑连接 4.选择自己手机的系统版本,然后点击"已打开USB设置,下一步" 5.手机和电脑连接成功后点击"开始root" 6.然后百度一键root就会自动对你手机进行root 安卓手机取消root权限方法 百度一键root取消手机root权限方法 2.用USB线将手机和电脑连接 3.选择你手机的root后的系统版本,然后

php中执行系统命令的方法_php技巧

本文实例讲述了php中执行系统命令的方法.分享给大家供大家参考.具体分析如下: 在php中执行系统命令,如LS <?php // exec.php $cmd = "dir"; // Windows // $cmd = "ls"; // Linux, Unix & Mac exec(escapeshellcmd($cmd), $output, $status); if ($status) echo "Exec command failed&qu

linux下php以root权限执行命令

最近由于要做一个php的接口,但是因为权限问题,不能执行一些特定命令,原因是php以nobody来运行. 网上搜索了些解决方案,一种是使用su的方法,一种是以c程序来实现,还有一种是用super程序实现. 比较了下,觉得super命令php调用起来更为方便一些,因此本篇主要介绍super的简单实现方法. 一.首先下载安装super,过程如下: [root@ossec.cn ~]#wget ftp://ftp.ucolick.org/pub/users/will/super-3.30.0-tar.

user表及root权限丢失的解决方法 如何设置服务器安全

root权限丢失 今天本来是想把root修改成别的名字 哪知道是直接创建一个用户,然后root给我删除了,啥权限都没了,user表 权限全是n,我当时连user表都给我清空了害怕冲突 TRUNCATE TABLE user;  清空user表数据 insertintomysql.user(Host,User,Password)values("localhost","root","****"); //插入数据 mysql> select* f

魅族MX4 Pro手机ROOT权限获得与取消方法

一键Root魅族MX4 Pro教程 方法一 一.在魅族MX4 Pro桌面找到并点击进入[设置],如图所示. 进入设置 二.然后进入[账户]设置,然后再点击头像,进入个人账户设置,如图所示. 三.接下来需要登陆你的Flyme账号,这里输入Flyme账号与密码登陆即可,如图所示. 四.进入自己个人账户界面后,我们再找到[开放系统权限],该项也就是获取ROOT设置选项了,默认是关闭的,我们点击进入[开启]即可,如下图所示. 五.选择开启魅族MX4 Pro的开放系统权限后,需要再次输入一次Flyme密码

linux普通用户获得root密码执行root权限的进程

问题描述 linux普通用户获得root密码执行root权限的进程 我想写一个程序,仿照在非root用户下安装程序时,提示需要root密码,然后就能继续安装.意思就是获得root密码后,我就能执行root权限的进程.这个该什么思路呢?execve函数的第三个参数设置环境变量能不能实现? 解决方案 普通用户执行ROOT权限 解决方案二: 用程序的话就有点麻烦了,可以使用Linux脚本,很方便,SHell脚本 解决方案三: python供你参考: #!/usr/bin/env python3 -*-

MySQL 0Day漏洞出现 该漏洞可以拿到本地Root权限 绿盟科技发布防护方案

2016年9月12日, legalhackers.com网站发布了编号为CVE-2016-6662的0day漏洞公告 .由于该漏洞可以获得MySQL服务器的Root权限,且影响MySql5.5.5.6.5.7乃至最新版本,绿盟科技安全团队发布高级威胁预警通告,这意味着该漏洞影响范围比较广,危害严重,利用难度较低,绿盟科技将在7*24小时内部应急跟踪,24小时内完成技术分析.产品升级和防护方案. 该漏洞可以允许攻击者远程向MySQL配置文件(my.cnf)注入恶意的环境配置,从而导致严重后果.该漏