前面象Shaun Clowes和rfp等都比較詳細的介紹了php、cgi程序在編程過程中遇到的問題,以及如何通過應用程序漏洞突破系統,這篇文章我們來通過對php的一些服務器端特性來進行配置加強php的安全。寫cgi腳本的時候我們的確一定注意各種安全問題,對用戶輸入進行嚴格的過濾,但是常在岸邊走哪有不濕鞋,吃燒餅哪有不掉芝麻,人有失蹄馬有失手,連著名的phpnuke、phpMyAdmin等程序都出現過很嚴重的問題,更何況象我等小混混寫的腳本。所以現在我們假設php腳本已經出現嚴重問題,比如象前一陣子 phpnuke的可以上傳php腳本的大問題了,我們如何通過對服務器的配置使腳本出現如此問題也不能突破系統。
1、編譯的時候注意補上已知的漏洞
從4.0.5開始,php的mail函數加入了第五個參數,但它沒有好好過濾,使得php應用程序能突破safe_mode的限制而去執行命令。所以使用4.0.5和4.0.6的時候在編譯前我們需要修改php源碼包裡ext/standard/mail.c文件,禁止mail函數的第五參數或過濾shell字符。在mail.c文件的第152行,也就是下面這行:
if (extra_cmd != NULL) {
後面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然後編譯php那麼我們就修補了這個漏洞。
2、修改php.ini配置文件
以php發行版的php.ini-dist為藍本進行修改。
1)Error handling and logging
在Error handling and logging部分可以做一些設定。先找到:
display_errors = On
php缺省是打開錯誤信息顯示的,我們把它改為:
display_errors = Off
關閉錯誤顯示後,php函數執行錯誤的信息將不會再顯示給用戶,這樣能在一定程度上防止攻擊者從錯誤信息得知腳本的物理位置,以及一些其它有用的信息,起碼給攻擊者的黑箱檢測造成一定的障礙。這些錯誤信息可能對我們自己有用,可以讓它寫到指定文件中去,那麼修改以下:
log_errors = Off
改為:
log_errors = On
以及指定文件,找到下面這行:
;error_log = filename
去掉前面的;注釋,把filename改為指定文件,如/usr/local/apache/logs/php_error.log
error_log = /usr/local/apache/logs/php_error.log
這樣所有的錯誤都會寫到php_error.log文件裡。
2)Safe Mode
php的safe_mode功能對很多函數進行了限制或禁用了,能在很大程度解決php的安全問題。在Safe Mode部分找到:
safe_mode = Off
改為:
safe_mode = On
這樣就打開了safe_mode功能。象一些能執行系統命令的函數shell_exec()和``被禁止,其它的一些執行函數如:exec(), system(), passthru(), popen()將被限制只能執行safe_mode_exec_dir指定目錄下的程序。如果你實在是要執行一些命令或程序,找到以下:
safe_mode_exec_dir =
指定要執行的程序的路徑,如:
safe_mode_exec_dir = /usr/local/php/exec
然後把要用的程序拷到/usr/local/php/exec目錄下,這樣,象上面的被限制的函數還能執行該目錄裡的程序。
關於安全模式下受限函數的詳細信息請查看php主站的說明:
http://www.php.net/manual/en/features.safe-mode.php ;
3)disable_functions
如果你對一些函數的危害性不太清楚,而且也沒有使用,索性把這些函數禁止了。找到下面這行:
disable_functions =
在”=“後面加上要禁止的函數,多個函數用”,“隔開。