文章詳情頁(yè)
通過(guò)對(duì)服務(wù)器端特性的配置加強(qiáng)php的安全
瀏覽:12日期:2024-01-25 08:18:19
作者:san < xuzhikun@nsfocus.com > 主頁(yè):http://www.nsfocus.com 日期:2001-11-15 ;;;;前面象Shaun Clowes和rfp等都比較詳細(xì)的介紹了php、cgi程序在編程過(guò)程中遇到 的問(wèn)題,以及如何通過(guò)應(yīng)用程序漏洞突破系統(tǒng),這篇文章我們來(lái)通過(guò)對(duì)php的一些服務(wù)器端特性來(lái)進(jìn)行配置加強(qiáng)php的安全。寫(xiě) cgi腳本的時(shí)候我們的確一定注意各種安全問(wèn)題,對(duì)用戶(hù)輸入進(jìn)行嚴(yán)格的過(guò)濾,但是常在岸邊走哪有不濕鞋 ,吃燒餅?zāi)挠胁坏糁ヂ椋擞惺泷R有失手,連著名的phpnuke、phpMyAdmin等程序都出現(xiàn)過(guò)很?chē)?yán)重的 問(wèn)題,更何況象我等小混混寫(xiě)的腳本。所以現(xiàn)在我們假設(shè)php腳本已經(jīng)出現(xiàn)嚴(yán)重問(wèn)題,比如象前一陣子 phpnuke的可以上傳php腳本的大問(wèn)題了,我們?nèi)绾瓮ㄟ^(guò)對(duì)服務(wù)器的配置使腳本出現(xiàn)如此問(wèn)題也不能突破 系統(tǒng)。1、編譯的時(shí)候注意補(bǔ)上已知的漏洞;;;從4.0.5開(kāi)始,php的mail函數(shù)加入了第五個(gè)參數(shù),但它沒(méi)有好好過(guò)濾,使得php;;;應(yīng)用程序能突破safe_mode的限制而去執(zhí)行命令。所以使用4.0.5和4.0.6的時(shí)候;;;在編譯前我們需要修改php源碼包里;;;ext/standard/mail.c文件,禁止mail函數(shù)的第五參數(shù)或過(guò)濾shell字符。在mail.c;;;文件的第152行,也就是下面這行:;;;if (extra_cmd != NULL) { ;;;后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);;;;然后編譯php,那么我們就修補(bǔ)了這個(gè)漏洞。2、修改php.ini配置文件;;;以php發(fā)行版的php.ini-dist為藍(lán)本進(jìn)行修改。;;;1)Error handling and logging;;;;;在Error handling and logging部分可以做一些設(shè)定。先找到:;;;;;display_errors = On;;;;;php缺省是打開(kāi)錯(cuò)誤信息顯示的,我們把它改為:;;;;;display_errors = Off;;;;;關(guān)閉錯(cuò)誤顯示后,php函數(shù)執(zhí)行錯(cuò)誤的信息將不會(huì)再顯示給用戶(hù),這樣能在一;;;;;定程度上防止攻擊者從錯(cuò)誤信息得知腳本的物理位置,以及一些其它有用的;;;;;信息,起碼給攻擊者的黑箱檢測(cè)造成一定的障礙 。這些錯(cuò)誤信息可能對(duì)我們 自己有用,可以讓它寫(xiě)到指定文件中去,那么修改以下:;;;;;log_errors = Off;;;;;改為:;;;;;log_errors = On;;;;;以及指定文件,找到下面這行:;;;;;;error_log = filename;;;;;去掉前面的;注釋?zhuān)裦ilename改為指定文件,如;;;;;/usr/local/apache/logs/php_error.log;;;;;error_log = /usr/local/apache/logs/php_error.log;;;;;這樣所有的錯(cuò)誤都會(huì)寫(xiě)到php_error.log文件里。;;;2)Safe Mode;;;;;php的safe_mode功能對(duì)很多函數(shù)進(jìn)行了限制或禁用了,能在很大程度解決php的;;;;;安全問(wèn)題。在Safe Mode部分找到:;;;;;safe_mode = Off;;;;;改為:;;;;;safe_mode = On;;;;;這樣就打開(kāi)了safe_mode功能。象一些能執(zhí)行系統(tǒng)命令的函數(shù)shell_exec()和``;;;;;被禁止,其它的一些執(zhí)行函數(shù)如:exec(), system(), passthru(), popen();;;;;將被限制只能執(zhí)行safe_mode_exec_dir指定目錄下的程序。如果你實(shí)在是要 執(zhí)行一些命令或程序,找到以下:;;;;;safe_mode_exec_dir =;;;;;指定要執(zhí)行的程序的路徑,如:;;;;;safe_mode_exec_dir = /usr/local/php/exec;;;;;然后把要用的程序拷到/usr/local/php/exec目錄下,這樣,象上面的被限制;;;;;的函數(shù)還能執(zhí)行該目錄里的程序。;;;;;關(guān)于安全模式下受限函數(shù)的詳細(xì)信息請(qǐng)查看php主站的說(shuō)明:;;;;;http://www.php.net/manual/en/features.safe-mode.php;;;3)disable_functions;;;;;如果你對(duì)一些函數(shù)的危害性不太清楚,而且也沒(méi)有使用,索性把這些函數(shù)禁;;;;;止了。找到下面這行:;;;;;disable_functions =;;;;;在”=“后面加上要禁止的函數(shù),多個(gè)函數(shù)用”,“隔開(kāi)。3、修改httpd.conf;;;如果你只允許你的php腳本程序在web目錄里操作,還可以修改httpd.conf文件限 制php的操作路徑。比如你的web目錄是/usr/local/apache/htdocs,那么在;;;httpd.conf里加上這么幾行:;;;<Directory /usr/local/apache/htdocs>;;;;;php_admin_value open_basedir /usr/local/apache/htdocs;;;</Directory>;;;這樣,如果腳本要讀取/usr/local/apache/htdocs以外的文件將不會(huì)被允許,;;;如果錯(cuò)誤顯示打開(kāi)的話(huà);;;會(huì)提示這樣的錯(cuò)誤:;;;Warning: open_basedir restriction in effect. File is in wrong directory in ;;;/usr/local/apache/htdocs/open.php on line 4;;;等等。4、對(duì)php代碼進(jìn)行編譯;;;Zend對(duì)php的貢獻(xiàn)很大,php4的引擎就是用Zend的,而且它還開(kāi)發(fā)了ZendOptimizer;;;和ZendEncode等許多php的加強(qiáng)組件。優(yōu)化器ZendOptimizer只需在;;;http://www.zend.com注冊(cè)就可以免費(fèi)得到,下面幾個(gè)是用于4.0.5和4.0.6的;;;ZendOptimizer,文件名分別對(duì)于各自的系統(tǒng):;;;ZendOptimizer-1[1].1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz;;;ZendOptimizer-1[1].1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz;;;ZendOptimizer-1[1].1.0-PHP_4.0.5-Solaris-sparc.tar.gz;;;ZendOptimizer-1[1].1.0-PHP_4.0.5-Windows-i386.zip;;;優(yōu)化器的安裝非常方便,包里面都有詳細(xì)的說(shuō)明。以UNIX版本的為例,看清操;;;作系統(tǒng),把包里的ZendOptimizer.so文件解壓到一個(gè)目錄,假設(shè)是/usr/local/lib;;;下,在php.ini里加上兩句:;;;zend_optimizer.optimization_level=15;;;zend_extension="/usr/local/lib/ZendOptimizer.so";;;就可以了。用phpinfo()看到Zend圖標(biāo)左邊有下面文字:;;;with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies;;;那么,優(yōu)化器已經(jīng)掛接成功了。;;;但是編譯器ZendEncode并不是免費(fèi)的,這里提供給大家一個(gè);;;http://www.PHPease.com的馬勇設(shè)計(jì)的編譯器外殼,如果用于商業(yè)目的,請(qǐng)與;;;http://www.zend.com聯(lián)系取得許可協(xié)議。;;;php腳本編譯后,腳本的執(zhí)行速度增加不少,腳本文件只能看到一堆亂碼,這將;;;阻止攻擊者進(jìn)一步分析服務(wù)器上的腳本程序,而且原先在php腳本里以明文存儲(chǔ);;;的口令也得到了保密,如mysql的口令。不過(guò)在服務(wù)器端改腳本就比較麻煩了,;;;還是本地改好再上傳吧。5、文件及目錄的權(quán)限設(shè)置;;;web目錄里除了上傳目錄,其它的目錄和文件的權(quán)限一定不能讓nobody用戶(hù)有寫(xiě);;;權(quán)限。否則,攻擊者可;;;以修改主頁(yè)文件,所以web目錄的權(quán)限一定要設(shè)置好;;;。 還有,php腳本的屬主千萬(wàn)不能是root,因?yàn)閟afe_mode下讀文件的函數(shù)被限;;;制成被讀文件的屬主必須;;;和當(dāng)前執(zhí)行腳本的屬主是一樣才能被讀,否則如果;;;錯(cuò)誤顯示打開(kāi)的話(huà)會(huì)顯示諸如以下的錯(cuò)誤:;;;Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not ;;;allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php ;;;on line 3;;;這樣我們能防止許多系統(tǒng)文件被讀,比如:/etc/passwd等。;;;上傳目錄和上傳腳本的屬主也要設(shè)成一樣,否則會(huì)出現(xiàn)錯(cuò)誤的,在safe_mode下;;;這些要注意。6、mysql的啟動(dòng)權(quán)限設(shè)置;;;mysql要注意的是不要用root來(lái)啟動(dòng),最好另外建一個(gè)mysqladm用戶(hù)。可以在;;;/etc/rc.local等系統(tǒng)啟動(dòng)腳本里加上一句:;;;su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start";;;這樣系統(tǒng)重啟后,也會(huì)自動(dòng)用mysqladmin用戶(hù)啟動(dòng)mysql進(jìn)程。7、日志文件及上傳目錄的審核及;;;查看日志和人的惰性有很大關(guān)系,要從那么大的日志文件里查找攻擊痕跡有些大海撈針,而且也未必有。 web上傳的目錄里的文件,也應(yīng)該經(jīng)常檢查,也許;;;程序有問(wèn)題,用戶(hù)傳上了一些非法的文件,比如執(zhí)行腳本等。8、操作系統(tǒng)自身的補(bǔ)丁;;;一樣,給系統(tǒng)打已知漏洞的補(bǔ)丁是系統(tǒng)管理員最基本的職責(zé),這也是最后一道防線。;;;經(jīng)過(guò)以上的配置,雖然說(shuō)不上固若金湯,但是也在相當(dāng)程度上給攻擊者的測(cè)試造成很多麻煩,即使php腳本程序出現(xiàn)比較嚴(yán)重的漏洞,攻擊者也無(wú)法造成實(shí)際性的破壞。如果您還有更古怪,更變態(tài)的配置方法,希望能一起分享分享;)
標(biāo)簽:
PHP
上一條:php中的時(shí)間處理下一條:PHP中GET變量的使用
排行榜
