在玩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>
intmain()
{
uid_tuid,euid;
charcmd[1024];
uid=getuid();
euid=geteuid();
printf("myuid:%u\n",getuid());//这里显示的是当前的uid可以注释掉.
printf("myeuid:%u\n",geteuid());//这里显示的是当前的euid
if(setreuid(euid,uid))//交换这两个id
perror("setreuid");
printf("aftersetreuiduid:%u\n",getuid());
printf("afersertreuideuid:%u\n",geteuid());
system("/sbin/iptables-L");//执行iptables-L命令
return0;
}
[/CODE]
编译该文件gcc-oipt-Wallipt.c
在该路径下生成ipt这个可执行文件.
如果现在用PHP网页调用该ipt的话,即使setreuid了也是不行的.
接下来要做的是chmodu+s./ipt
ls一下
-rwsr-xr-x1rootroot5382Jul221:45ipt
s位已经设置上了.
再写一个php页面调用它.
<?php
echo'<pre>';
$last_line=system('/var/www/html/http/ipt',$retval);
echo'
</pre>
<hr/>Lastlineoftheoutput:'.$last_line.'
<hr/>Returnvalue:'.$retval;
?>
在浏览器中浏览.
ChainINPUT(policyACCEPT)
targetprotoptsourcedestination
ChainFORWARD(policyDROP)
targetprotoptsourcedestination
ACCEPTall--anywhereanywherestateRELATED,ESTABLISHED
ChainOUTPUT(policyACCEPT)
targetprotoptsourcedestination
myuid:48
myeuid:0
aftersetreuiduid:0
afersertreuideuid:48
--------------------------------------------------------------------------------
Lastlineoftheoutput:afersertreuideuid:48
--------------------------------------------------------------------------------
Returnvalue:0
该命令执行成功..
众所周知:apache的uid为48.调用setreuid后将有效用户id和实际用户id互换了.(必须在chmodu+s生效的情况下)使apache当前的uid为0这样就能执行root命令了。
大家只需要更改C文件中的system所要执行的命令就可以实现自己的PHP执行root命令了.