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