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


Posted in PHP onFebruary 10, 2011

用来作为解决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; 
?>

在浏览器中浏览.

[color=Red]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 [/color]
[color=Blue]my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48[/color]

--------------------------------------------------------------------------------
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命令了.

PHP 相关文章推荐
mysql 性能的检查和优化方法
Jun 21 PHP
php 用checkbox一次性删除多条记录的方法
Feb 23 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
Jun 04 PHP
PHP排序之二维数组的按照字母排序实现代码
Aug 13 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
PHP递归删除目录几个代码实例
Apr 21 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
php代码调试利器firephp安装与使用方法分析
Aug 21 PHP
PHP开发中常用的字符串操作函数
Feb 08 #PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 #PHP
php 数组的指针操作实现代码
Feb 08 #PHP
PHP游戏编程25个脚本代码
Feb 08 #PHP
PHP通用检测函数集合
Feb 08 #PHP
.htaccess文件保护实例讲解
Feb 06 #PHP
延长phpmyadmin登录时间的方法
Feb 06 #PHP
You might like
提高PHP编程效率的方法
2013/11/07 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
PyTorch基本数据类型(一)
2019/05/22 Python
python求最大值最小值方法总结
2019/06/25 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Python实现名片管理系统
2020/02/14 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Python如何对XML 解析
2020/06/28 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
手工社团活动方案
2014/02/17 职场文书
法人授权委托书范本
2014/04/04 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
关于运动会的广播稿
2014/09/22 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
2015新年寄语大全
2014/12/08 职场文书
检讨书格式范文
2015/05/07 职场文书