PHP安全配置

2021-09-30 06:15:45 字數 4292 閱讀 9214

繼續上傳 ";

exit;

} ?>

這樣的上傳**存在讀取任意檔案和執行命令的重大問題。

下面的請求可以把/etc/passwd文件拷貝到web目錄/usr/local/apache/htdocs/test(注意:這個目錄必須nobody可寫)下的attack.txt檔案裡:

然後可以用如下請求讀取口令檔案:

攻擊者可以把php檔案拷貝成其它副檔名,洩漏指令碼源**。

攻擊者可以自定義form裡file_name變數的值,上傳覆蓋任意有寫許可權的檔案。

攻擊者還可以上傳php指令碼執行主機的命令。

解決方法:

php-4.0.3以後提供了is_uploaded_file和move_uploaded_file函式,可以檢查操作的檔案是否是使用者上傳的檔案,從而避免把系統檔案拷貝到web目錄。

使用$http_post_files陣列來讀取使用者上傳的檔案變數。

嚴格檢查上傳變數。比如不允許是php指令碼檔案。

把php指令碼操作限制在web目錄可以避免程式設計師使用copy函式把系統檔案拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini裡upload_tmp_dir的值。

把php指令碼用phpencode進行加密,避免由於copy操作洩漏原始碼。

嚴格配置檔案和目錄的許可權,只允許上傳的目錄能夠讓nobody使用者可寫。

對於上傳目錄去掉php解釋功能,可以通過修改httpd.conf實現:

php_flag engine off

#如果是php3換成php3_engine off

重啟apache,upload目錄的php檔案就不能被apache解釋了,即使上傳了php檔案也沒有問題,只能直接顯示原始碼。

6、命令執行

下面的**片斷是從phpnettoolpack摘出,詳細的描述見:

//test_6.php

system("traceroute $a_query",$ret_strs);

?>

由於程式沒有過濾$a_query變數,所以攻擊者可以用分號來追加執行命令。

攻擊者輸入如下請求可以執行cat /etc/passwd命令:

php的命令執行函式還有system(), passthru(), popen()和``等。命令執行函式非常危險,慎用。如果要使用一定要嚴格檢查使用者輸入。

解決方法:

要求程式設計師使用escapeshellcmd()函式過濾使用者輸入的shell命令。

啟用safe_mode可以杜絕很多執行命令的問題,不過要注意php的版本一定要是最新的,小於php-4.2.2的都可能繞過safe_mode的限制去執行命令。

7、sql_inject

如下的sql語句如果未對變數進行處理就會存在問題:

select * from login where user='$user' and pass='$pass'

攻擊者可以使用者名稱和口令都輸入1' or 1='1繞過驗證。

不過幸虧php有乙個預設的選項magic_quotes_gpc = on,該選項使得從get, post, cookie來的變數自動加了addslashes()操作。上面sql語句變成了:

select * from login where user='1/' or 1=/'1' and pass='1/' or 1=/'1'

從而避免了此類sql_inject攻擊。

對於數字型別的字段,很多程式設計師會這樣寫:

select * from test where id=$id

由於變數沒有用單引號擴起來,就會造成sql_inject攻擊。幸虧mysql功能簡單,沒有sqlserver等資料庫有執行命令的sql語 句,而且php的mysql_query()函式也只允許執行一條sql語句,所以用分號隔開多條sql語句的攻擊也不能奏效。但是攻擊者起碼還可以讓查 詢語句出錯,洩漏系統的一些資訊,或者一些意想不到的情況。

解決方法:

要求程式設計師對所有使用者提交的要放到sql語句的變數進行過濾。

即使是數字型別的字段,變數也要用單引號擴起來,mysql自己會把字串處理成數字。

在mysql裡不要給php程式高階別許可權的使用者,只允許對自己的庫進行操作,這也避免了程式出現問題被 select into outfile ... 這種攻擊。

8、警告及錯誤資訊

php預設顯示所有的警告及錯誤資訊:

error_reporting = e_all & ~e_notice

display_errors = on

在平時開發除錯時這非常有用,可以根據警告資訊馬上找到程式錯誤所在。

正式應用時,警告及錯誤資訊讓使用者不知所措,而且給攻擊者洩漏了指令碼所在的物理路徑,為攻擊者的進一步攻擊提供了有利的資訊。而且由於自己沒有訪 問到錯誤的地方,反而不能及時修改程式的錯誤。所以把php的所有警告及錯誤資訊記錄到乙個日誌檔案是非常明智的,即不給攻擊者洩漏物理路徑,又能讓自己 知道程式錯誤所在。

修改php.ini中關於error handling and logging部分內容:

error_reporting = e_all

display_errors = off

log_errors = on

error_log = /usr/local/apache/logs/php_error.log

然後重啟apache,注意檔案/usr/local/apache/logs/php_error.log必需可以讓nobody使用者可寫。

9、disable_functions

如果覺得有些函式還有威脅,可以設定php.ini裡的disable_functions(這個選項不能在httpd.conf裡設定),比如:

disable_functions = phpinfo, get_cfg_var

可以指定多個函式,用逗號分開。重啟apache後,phpinfo, get_cfg_var函式都被禁止了。建議關閉函式phpinfo, get_cfg_var,這兩個函式容易洩漏伺服器資訊,而且沒有實際用處。

10、disable_classes

這個選項是從php-4.3.2開始才有的,它可以禁用某些類,如果有多個用逗號分隔類名。disable_classes也不能在httpd.conf裡設定,只能在php.ini配置檔案裡修改。

11、open_basedir

前面分析例程的時候也多次提到用open_basedir對指令碼操作路徑進行限制,這裡再介紹一下它的特性。用open_basedir指定的限 制實際上是字首,不是目錄名。也就是說 "open_basedir = /dir/incl" 也會允許訪問 "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:"open_basedir = /dir/incl/"。

可以設定多個目錄,在windows中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為apache模組時,父目錄中的open_basedir路徑自動被繼承。

四、其它安全配置

1、取消其它使用者對常用、重要系統命令的讀寫執行許可權

一般管理員維護只需乙個普通使用者和管理使用者,除了這兩個使用者,給其它使用者能夠執行和訪問的東西應該越少越好,所以取消其它使用者對常用、重要系統命 令的讀寫執行許可權能在程式或者服務出現漏洞的時候給攻擊者帶來很大的迷惑。記住一定要連讀的許可權也去掉,否則在linux下可以用/lib/ld- linux.so.2 /bin/ls這種方式來執行。

如果要取消某程如果是在chroot環境裡,這個工作比較容易實現,否則,這項工作還是有些挑戰的。因為取消一些程式的執行許可權會導致一些服務運 行不正常。php的mail函式需要/bin/sh去呼叫sendmail發信,所以/bin/bash的執行許可權不能去掉。這是一項比較累人的工作,

2、去掉apache日誌其它使用者的讀許可權

apache的access-log給一些出現本地包含漏洞的程式提供了方便之門。通過提交包含php**的url,可以使access-log包含php**,那麼把包含檔案指向access-log就可以執行那些php**,從而獲得本地訪問許可權。

如果有其它虛擬主機,也應該相應去掉該日誌檔案其它使用者的讀許可權。

當然,如果你按照前面介紹的配置php那麼一般已經是無法讀取日誌檔案了。

php 配置安全設定!

安全 php 編寫是一方面,php的配置更是非常關鍵。我們php手手工安裝 的,php的預設配置檔案在 usr local apache2 conf php.ini,我們最主要就是要配置php.ini中的內容,讓我們執行 php能夠更安全。整個php中的安全設定主要是為了防止phpshell和sql...

PHP安全配置 3

5 檔案上傳 php的檔案上傳機制是把使用者上傳的檔案保留在php.ini的upload tmp dir定義的臨時目錄 預設是系統的臨時目錄,如 tmp 裡的乙個類似phpxxuoxg的隨機臨時檔案,程式履行結束,該臨時檔案也被刪除。php給上傳的檔案定義了四個變數 如form變數名是file,而且...

PHP安全配置 1

一 web伺服器安全 php其實不過是web伺服器的乙個模組功能,所以首先要保證web伺服器的安全。當然web伺服器要安全又必須是先保證系統安全,這樣就扯遠了,無窮無盡。php可以和各種web伺服器結合,這裡也只討論apache。非常建議以chroot方式安裝啟動apache,這樣即使apache和...