天天看點

PHP安全方面的配置

disable_functions= passthru,exec,shell_exec,system,fopen,mkdir,rmdir,chmod,unlink,dir 

  ,fopen,fread,fclose,fwrite,file_exists 

  ,closedir,is_dir,readdir.opendir 

  ,fileperms.copy,unlink,delfile 

disable_functions =unlink,opendir,chdir,rmdir,phpinfo,passthru,exec,shell_exec,popen,wscript,system

通過對php一些伺服器端特性的配置加強php的安全

by [email protected]

前面象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 =

在”=“後面加上要禁止的函數,多個函數用”,“隔開。

3、修改httpd.conf

如果你隻允許你的php腳本程式在web目錄裡操作,還可以修改httpd.conf檔案限制php的操作路徑。比

如你的web目錄是/usr/local/apache/htdocs,那麼在httpd.conf裡加上這麼幾行:

php_admin_value open_basedir /usr/local/apache/htdocs

這樣,如果腳本要讀取/usr/local/apache/htdocs以外的檔案将不會被允許,如果錯誤顯示打開的話

會提示這樣的錯誤:

Warning: open_basedir restriction in effect. File is in wrong directory in

/usr/local/apache/htdocs/open.php on line 4

等等。

4、對php代碼進行編譯

Zend對php的貢獻很大,php4的引擎就是用Zend的,而且它還開發了ZendOptimizer和ZendEncode

等許多php的加強元件。優化器ZendOptimizer隻需在http://www.zend.com注冊就可以免費得到,

下面幾個是用于4.0.5和4.0.6的ZendOptimizer,檔案名分别對于各自的系統:

ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz

ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz

ZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz

ZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip

優化器的安裝非常友善,包裡面都有詳細的說明。以UNIX版本的為例,看清作業系統,把包裡的

ZendOptimizer.so檔案解壓到一個目錄,假設是/usr/local/lib下,在php.ini裡加上兩句:

zend_optimizer.optimization_level=15

zend_extension="/usr/local/lib/ZendOptimizer.so"

就可以了。用phpinfo()看到Zend圖示左邊有下面文字:

with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies

那麼,優化器已經挂接成功了。

但是編譯器ZendEncode并不是免費的,這裡提供給大家一個http://www.PHPease.com的馬勇設計的

編譯器外殼,如果用于商業目的,請與http://www.zend.com聯系取得許可協定。

php腳本編譯後,腳本的執行速度增加不少,腳本檔案隻能看到一堆亂碼,這将阻止攻擊者進一步分析服

務器上的腳本程式,而且原先在php腳本裡以明文存儲的密碼也得到了保密,如mysql的密碼。不過在服

務器端改腳本就比較麻煩了,還是本地改好再上傳吧。

5、檔案及目錄的權限設定

web目錄裡除了上傳目錄,其它的目錄和檔案的權限一定不能讓nobody使用者有寫權限。否則,攻擊者可

以修改首頁檔案,是以web目錄的權限一定要設定好。

還有,php腳本的屬主千萬不能是root,因為safe_mode下讀檔案的函數被限制成被讀檔案的屬主必須

和目前執行腳本的屬主是一樣才能被讀,否則如果錯誤顯示打開的話會顯示諸如以下的錯誤:

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

這樣我們能防止許多系統檔案被讀,比如:/etc/passwd等。

上傳目錄和上傳腳本的屬主也要設成一樣,否則會出現錯誤的,在safe_mode下這些要注意。

6、mysql的啟動權限設定

mysql要注意的是不要用root來啟動,最好另外建一個mysqladm使用者。可以在/etc/rc.local等系統

啟動腳本裡加上一句:

su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"

這樣系統重新開機後,也會自動用mysqladmin使用者啟動mysql程序。

7、日志檔案及上傳目錄的稽核及

檢視日志和人的惰性有很大關系,要從那麼大的日志檔案裡查找攻擊痕迹有些大海撈針,而且也未必有。

web上傳的目錄裡的檔案,也應該經常檢查,也許程式有問題,使用者傳上了一些非法的檔案,比如執行腳

本等。

8、作業系統自身的更新檔

一樣,給系統打已知漏洞的更新檔是系統管理者最基本的職責,這也是最後一道防線。

經過以上的配置,雖然說不上固若金湯,但是也在相當程度上給攻擊者的測試造成很多麻煩,即使php腳本程

序出現比較嚴重的漏洞,攻擊者也無法造成實際性的破壞。

如果您還有更古怪,更變态的配置方法,希望能一起分享分享;)

參考資料:

PHP Manual

http://www.zend.com

版權聲明:本文為CSDN部落客「weixin_33796177」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33796177/article/details/91933309