讓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; 
?> 

在瀏覽器中瀏覽. 

[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命令了.
詳細出處參考:http://www.jb51.net/article/26232.htm
相關文章
相關標籤/搜索