激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 讓PHP以ROOT權限執(zhí)行系統(tǒng)命令的方法

讓PHP以ROOT權限執(zhí)行系統(tǒng)命令的方法

2019-11-18 13:57php教程網(wǎng) PHP教程

這種問題我想大家可能都遇到過,網(wǎng)友提供的解決方法也很多。我也只是結合自己系統(tǒng)的需求并結合網(wǎng)友的解決方案來總結的一種方法

用來作為解決php以root權限執(zhí)行一些普通用戶不能執(zhí)行的命令或應用的參考。 
其實php里的popen()函數(shù)是可以解決這個問題的,但是由于某些版本的linux(如我使用的Centos 5)對系統(tǒng)安全的考慮, 
使得這個問題解決起來麻煩了好多。先來看一個網(wǎng)友使用popen()函數(shù)的例子。 

復制代碼代碼如下:


/* PHP中如何增加一個系統(tǒng)用戶 
下面是一段例程,增加一個名字為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); 


經(jīng)過自己的測試,證實此段代碼是不能實現(xiàn)(至少在我的系統(tǒng)里是這樣的)作者想要獲得的結果的。經(jīng)過自己很長時間的google之后, 
問題的關鍵是su root這個命令需要的密碼必須以終端的方式輸入,不能通過其它的方式(我也不知道還有沒有其它的方式)獲得。 
又由于項目要求不能使用類似于sudo這種應用,無奈之下,我選擇了網(wǎng)友提出的用編寫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"); //執(zhí)行腳本 
return 0; 


編譯該文件: 
gcc -o run -Wall run.c 
在該路徑下生成run文件,這個可執(zhí)行文件。如果現(xiàn)在用PHP腳本調用 該run的話,即使setreuid了 也是不行的。 
接下來要做的是:給run賦予suid權限 
# chmod u+s run 
# ls 
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run 
好了,已經(jīng)設置上了,再寫一個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 
該命令執(zhí)行成功。 
從顯示結果可以看出: apache(daemon)的uid 為48(事實上很多l(xiāng)inux系統(tǒng)下daemon的uid為2)。 
調用setreuid后將有效用戶id和實際用戶id互換了。(必須在chmod u+s生效的情況下) 使apache當前的uid為0這樣就能執(zhí)行root命令了。 
只需要更改 C文件中的system所要執(zhí)行的命令就可以實現(xiàn)自己的PHP以root角色執(zhí)行命令了。 

在玩C 以前 玩過一段時間的PHP, 哪個時候需要用PHP 來運行root命令,一直未果,直到有一天搜索到了super這個插件. 
隨著玩C的日子多了.發(fā)現(xiàn)可以用C語言來包裹 要運行的外部命令. 實驗了一下.成功了. 
不需要任何外部工具就可以實現(xiàn)用PHP 執(zhí)行root命令. 
我下面就把方法發(fā)布給大家,有需求用php來運行root命令的朋友可以不用發(fā)愁了. 
平臺: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"); //執(zhí)行iptables -L命令 
return 0; 



編譯該文件 gcc -o ipt -Wall ipt.c 
在該路徑下生成ipt 這個可執(zhí)行文件. 
如果現(xiàn)在用PHP網(wǎng)頁調用 該ipt的話,即使setreuid了 也是不行的. 
接下來要做的是chmod u+s ./ipt 
ls 一下 
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt 
s位已經(jīng)設置上了. 
再寫一個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 

該命令執(zhí)行成功.. 
眾所周知: apache的uid 為48. 調用setreuid后 將有效用戶id 和實際用戶id互換了.(必須在chmod u+s生效的情況下) 使apache當前的 uid為0 這樣就能執(zhí)行root命令了。 

大家只需要更改 C文件中的 system所要執(zhí)行的命令就可以實現(xiàn)自己的PHP執(zhí)行root命令了.

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产99久久久久久 | 伊人午夜视频 | 香蕉在线看 | 成人免费一区二区三区视频网站 | 久草在线资源福利站 | 久久蜜桃精品一区二区三区综合网 | 免费毛片播放 | 国产精品性夜天天视频 | 久久99亚洲精品久久99果 | 精品久久久久久亚洲精品 | 成年人在线视频观看 | 欧美一级黄色免费看 | 91久久国产露脸精品国产护士 | 久久久久国产成人免费精品免费 | 国产噜噜噜噜久久久久久久久 | 国产精品久久久久久久久久东京 | 蜜桃网在线 | 亚洲精品久久久久久久久久 | 中文字幕视频在线播放 | 成人羞羞视频在线观看免费 | 97中文字幕第一一一页 | 一级全毛片 | 久久性生活免费视频 | 欧美日韩在线播放一区 | 污黄视频在线观看 | 在线成人一区二区 | 羞羞视频免费网站入口 | 成人视屏在线 | 国产成人av一区二区 | 黄网免费看 | 在线成人免费观看 | 一级做受大片免费视频 | 久久精品一区视频 | 成人福利在线 | 国产精品一区二区日韩 | 国产精品一区在线看 | 色玖玖综合 | asian裸体佳人pics | 日韩视频区 | 日朝毛片| 日韩视频区 |