讓PHP以ROOT許可權執行系統命令的方法&SUID,SGID,SBIT許可權的作用和設定
SUID:只對二進位制程式支援,只要擁有該程式的所有者擁有SUID的許可權,那麼其它使用者或者同組使用者擁有該程式的x許可權,就可以在程式執行過程中擁有所有者的許可權支援。
例如:(在root下操作)
有一檔案text的內容是hello world!,現在編寫一個讀出該檔案內容的程式
程式如下:
程式名為read
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp = fopen("/text","r");
char a=fgetc(fp);
while(a!=EOF)
{
putchar(a);
a=fgetc(fp);
}
fclose(fp);
return 0;
}
然後我們更改檔案和程式的許可權為
read -rwx-----x root root 檔案所有者可以讀寫執行,其它使用者能執行
text -r--------- root root 只有該檔案的所有者才能讀
現在執行read
輸出hello world!
在新建一個使用者qita,然後切換到其它,然後再執行./read則表示會出現錯誤
原因是read雖然可以執行但是目的是去讀text,text的許可權是隻有所有者能夠讀到,這是其它使用者,當然不能。要想能讀到方法是讓read擁有
SUID的許可權,此時就可以讓其它使用者在執行read時得到所有者的支援(得到所有者的許可權)。***要保證其它使用者對於該程式擁有可執行的許可權。
具體如下
1,切換到root使用者。
2,然後chmod u+s read 此時read就擁有了SUID許可權了。
3,切換到qita使用者,執行./read 就能夠輸出Hello world!了。
SGID:此許可權與SUID有類似的地方,但是SUID是得到所有者的支援,而SGID是得到同組使用者的支援。同樣是剛才的程式和檔案,我們改下許可權。
切換到root
text ----r----- root root 表示只有同組使用者才能讀
read -rwx--x--x root root
此時執行read,可以輸出Hello world!
然後切換到qita
此時執行read,這是侯就不能輸出了,原因是其text只能同組使用者讀寫。qita想要讀到text的內容必須得到root組的支援。
方法如下:
1,切換到root
2,chmod g+s read 這時候就擁有了SGID的許可權了
3,切換到qita,執行read,成功
注意:其它使用者必須擁有的程式的執行權!
SBIT:此許可權只對目錄有效,擁有此許可權的目錄,必須是目錄所有者,root,或則是目錄內檔案的建立者才能刪除目錄內的檔案,其它使用者是不能刪除的。