PHP 安全配置

來源:互聯網
上載者:User

最近公司伺服器中標有一段時間了.一直沒有找到好的解決辦法.現在吧找到的個人感覺有用的資料暫留一下.也希望有更好解決辦法的朋友出出招。解決一下

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 注意一些函數的過濾

  有些函數在程式中是經常使用的,像include(),require(),fopen(),fwrite(),readfile(),unlink(),eval()以及它們的變體函數等等。這些函數都很實用,實用並不代表讓你多省心,你還得為它們多費點心。

  1.include(),require()和fopen(),include_once(),require_once()這些都可以遠程調用檔案,對於它們的危害,google搜一下你就會很明了,對於所包含調用的變數沒過濾好,就可以任意包含檔案從而去執行。舉個例子,看print.php

  ...
  if (empty ($bn) ) { //檢查是變數$bn是否為空白
  include
("$cfg_dir/site_${site}.php"); //把$cfg_dir這個路徑裡的site_${site}.php包含進來
  ...

  不管存不存在$cfg_dir目錄,$site這個變數你可以很自然的去使用,因為他根本沒檢查$site變數啊。可以把變數$site指定遠程檔案去調用,也可以是本地的一個檔案,你所指定的檔案裡寫上php的語句,然後它就去包含執行這個含有php語句的檔案了.就像這樣

  列出檔案目錄

  甚至可以擴充到包含一些管理員檔案,提升許可權,典型的像以前phpwind,bo-blog的漏洞一樣。除了依靠php.ini裡的allow_url_fopen設為off禁止遠程使用檔案和open_base_dir禁止使用目錄以外的檔案外,你還得事先聲明好只能包含哪些檔案,這裡就不多說廢話了。

  2.fopen(),file(),readfile(),openfile(),等也是該特別留意的地方。函數本身並沒什麼,它們的作用是去開啟檔案,可是如果對變數過濾不徹底的話,就會泄露原始碼。這樣的函數文本論壇裡會有很多。

  ...
  $articlearray=openfile("$dbpath/$fid/$tid.php");
//開啟$dbpath/$fid這個路徑的$tid.php檔案

  $topic_detail=explode(" ",$articlearray[0]); //用分割符 讀出文章的內容
  ...

  很眼熟吧,這是ofstar以前版本的read.php,$fid和$tid沒有任何過濾,$tid指定為某個檔案提交,就發生了原代碼泄露。就像這樣。

  http://explame.com/ofstar/read.php?fid=123&tid=../index

  $tid會被加上php的尾碼,所以直接寫index。這僅僅是個例子,接著看吧。

  3.fwrite()和它的變體函數這種漏洞想想都想得出,對於使用者提交的字元沒過濾的話,寫入一段php後門又不是不可以。

  4.unlink()函數,前段時間,phpwind裡任意刪除檔案就是利用這個函數,對於判斷是否刪除的變數沒過濾,變數可以指定為任意檔案,當然就可以刪除任意檔案的變數。

  5.eval(),preg_replace()函數,它們的作用是執行php代碼,如果字串沒被經過任何過濾的話,會發生什麼呢,我就常看見一些cms裡面使用,想想,一句話的php木馬不就是根據eval()原理製作的嗎?

  6.對於system()這些系統函數,你會說在php.ini裡禁止系統函數,對,這也是好辦法,可是象一些程式裡需要,那是不是就不用了呢?就像上次我看到的一套很漂亮的php相簿一樣。另外對於popen(),proc_open(),proc_close()函數你也得特別注意,儘管他們執行命令後並沒有直接的輸出,但你想這到底對駭客們有沒有用呢。再這裡php提供提供了兩個函數,escapeshellarg(),escapeshellcmd(),這兩個函數用來對抗系統函數的調用攻擊,也就是過濾。

  對於危害,來舉個例子,我們來看某論壇prod.php

  07 $doubleApp = isset($argv[1]);
//初始設定變數$doubleApp
  ...
  14 if( $doubleApp ) //if語句
  15 {
  16
$appDir = $argv[1]; //初始化$appDir
  17 system("mkdir $prodDir/$appDir");
//使用系統函數system來建立目錄$prodDir/$appDir

  本來是拿來建立$prodDir/$appDir目錄的,再接著看上去,程式僅僅檢測是否存在$argv[1],缺少對$argv[1]的必要過濾,那麼你就可以這樣

  /prod.php?argv[1]= ls%20-la或者/prod.php?argv[1]= cat%20/etc/passwd

  (分割符   在這裡是UNIX的管道參數,可以執行多條命令。)

  到這裡,常見的漏洞類型應該知道點了吧。

  對於特殊字元的重視

  對於特殊字元,有句話叫All puts is
invalid.外國人文章裡這句話很常見的。所有輸入都是有害的。你永遠不要對使用者所輸入的東西省心,為了對付這些危害,程式員都在忙著過濾大把大把的字元,唯恐漏了什麼。而有些程式員呢?好像從沒注意過這些問題,從來都是敞開漏洞大門的。不說廢話,還是先看看下面這些東西吧。

  1.其實程式的漏洞裡最關鍵,最讓開發人員放心不下的就是帶著$符號的貨幣符號,變數,對於找漏洞的人來說,抓著變數兩個字就是一切。就像目錄遍曆這個bug,很多郵件程式都存在,開發人員考慮的很周全,有的甚至加上了網路硬碟這個東西,好是好,就像

  http://mail.com/file.php?id=1&put=list&tid=1&file=./

  要是我們把file這個變數換成./../甚至更上層呢?目錄就這樣被遍曆了。

  2.角括弧"<>"跨站你不會不知道吧,一些搜尋欄裡,文章,留言,像前段時間phpwind附件那裡的跨站等等。當然,對於跨站問題,你要過濾的遠遠不止角括弧。不怕過濾時漏掉什麼,而是怕你想不起要去過濾。

  3.斜杆和反斜杆:對於/和\的過濾,記得魔力論壇的附件下載處的原代碼泄露嗎?

  attachment.php?id=684&u=3096&extension=gif&attach=.\..\..\..\..\..\..\includes\config.php&filename=1.gif

  對於過濾.. / \的問題,像windows主機不僅要過濾../還要過濾..\,windows主機對\會解析為/,這些細節跟SQL
injection比起來,什麼才叫深入呢?

  4.對於反引號(``),反引號在php中很強大,它可以執行系統命令,就像system()這些系統函數一樣,如果使用者的惡意語句被它所執行的話就會危害伺服器,我想除了伺服器設定的很好以外,對於它們,你還是老老實實的過濾好吧。

  5.對於分行符號,NULL字元等等,像"\t,\x0B,\n,\r,\0這些,這些都是很有用的,像動網以前的上傳漏洞就是因為上傳中的NULL(\0)字元引起的,對於這些能隨意截斷程式流程的字元,你說我們在檢測的時候應該有多細心呢?

  6.分號(;)和分割符( )

  分號截斷程式流程,就像這個

  shell_exec("del
./yourpath/$file"); //使用系統函數shell_exec刪除檔案$file

  變數$file沒指定,那麼直接寫zizzy.php;del ./yourpath ,這樣你的yourpath目錄也就被del了。

  分割符( )是UNIX裡內建的管道函數,可以串連幾條命令來執行。有時候加在過濾不嚴的系統函數中執行。

  邏輯錯誤

  驗證不完全和一些邏輯錯誤在程式裡也很容易找到,特別是現在的程式員,只顧深入的學習,而對於邏輯錯誤等等這樣的安全意識都沒有培養的意識,其實這是是靠自己去培養,而不是等著人來報告bug給你。對於邏輯錯誤的判斷,我們只能說,多練練吧,經驗才是最重要的。

  1.對於登陸驗證的問題。舉個例子:我們看某論壇的admin.php片斷

  它這裡username 和
password好像不對勁吧,存在管理員的username和password就直接通過驗證,那就意味著沒有使用者名稱,沒密碼也行吧。我們提交

  GET /bbs/admin/index.php?page=general HTTP/1.1
  Accept:
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, */*
  Accept-Language: zh-cn

  Accept-Encoding: gzip, deflate
  User-Agent: Mozilla/4.0 (compatible;
MSIE 6.0; Windows NT 5.1; SV1; Maxthon)
  Host: 127.0.0.1
  Connection:
Keep-Alive
  Cookie: username=’or isnull(1/0) AND level=3/*; password=;

  這是我們偽造的一個資料包(你問我咋偽造地?抓包再修改唄),我們使用GET來提交資料,原理也就是在cookie這裡構造欺騙語句。

  接著,整個SQL語句就成這樣

  SELECT * FROM users WHERE username=’’or
isnull(1/0) AND level=3/*’ AND password=’’

  這裡僅僅用一個’or’=’or’的原理,就把username和password的檢測給繞開了,而level=3則是偽造的等級。從而就饒過了檢測,進入了管理後台。

  對於背景驗證不能這麼馬虎,兩行代碼就算完事,你還得從SESSION(會話),Cookie這些地方來增強驗證。

  2.上傳漏洞

  有次我看到在一個程式config.php裡對上傳檔案類型限制是這樣的

  $IllegalExtentions =
array(’exe’,’asp’,’php’,’php3’,’bat’,’cgi’,’pl’,’com’,’vbs’,’reg’,’pcd’,’pif’,’scr’,’bas’,’inf’,’vb’,’vbe’,’wsc’,’wsf’,’wsh’);
//對於上傳檔案的限制,只允許上傳exe,asp,php,php3,bat,cgi,pl,com,vbs,reg,pcd,pif,scr,bas,inf,vb,vbe,wsc,wsf,ws’這些檔案。

  規定不許使用者上傳什麼什麼檔案,其它都可以上傳,這種邏輯好不好呢?如果我上傳.inc, ,.php4 .phtml, .html, .pwml
這樣的類型呢?為什麼你不把這種邏輯思維改為規定使用者除了這幾種檔案能傳,其它的統統不允許上傳。就像這樣,數組改成逆向的思維。

  $IllegalExtentions =
array(’rar’,’gif’,’jpg’,’bmp’,’pdf’)//只能上傳rar,gif,jpg,bmp,pdf幾種格式

  其實這個跟你們上傳cer,asa是一個道理。

  3.典型的邏輯錯誤

  在一些cms(整站程式)中隨便註冊個使用者,你會發現修改資料的地方不要求輸入原來的密碼,只通過判斷使用者id或者email,你把網頁儲存到本地,把id或email改成管理員的,action
改為修改提交地址,提交你就成了管理員。解決辦法不太難,只要我們增加密碼驗證,增強那個mysql的update語句的過濾也就ok了。

  這些我們也沒辦法,多數程式員對於安全根本不去在意,本來一個人可以去做的事,為什麼偏偏要分出搞web安全的和web開發兩種人呢?

  長度問題

  別以為找漏洞的就是為了拿個管理員密碼或者webshell,也有些不安分的人,也就是DDOSer(拒絕服務的攻擊者),他們的花樣很多,但對於程式員來說,關鍵就在過濾。我所說的長度問題,不僅僅是個字元的長度,也包括時間的長度,你一定見過有人寫個指令碼,一下就註冊成千上萬的使用者,或者純粹的寫垃圾資料把資料庫拖死。這個時候,限制資料提交時間和驗證碼就起作用了。不過要真的遇到狠毒的人,一個變數的過濾問題就可以把網站搞癱瘓,這比用什麼網路殭屍那些軟體來得更快。

  不大不小的問題

  1.絕對路徑的泄露

  這個問題可真是不大不小,很多程式都有,這也算安全的一部分。至少你玩注入loadfile()需要吧。當然,這時的php.ini中的display_errors也可以起作用了。

  2.對背景驗證

  不要說不信,我就曾看到一些程式這樣,你去測試,註冊個使用者,提交管理員編輯使用者的URL,比如admin_member.php?action=edit&id=55level=4&username=zizzy&power=1這樣相應的添加管理員的URL,你會發現幾乎沒驗證,直接成功了。所以,對於背景檢測,也很有必要,就像剛出的Discuz的那個漏洞。

  過濾問題不知不覺就說了那麼多,寫了好多處該過濾的提醒,現在也該說說了如何進行過濾。

  1.在使用者輸入任何資料,也就是提交變數進資料庫時,我們必須使用addslashes()進行過濾,像我們的注入問題,一個addslashes()也就搞定了。其實在涉及到變數取值時,intval()函數對字串的過濾也是個不錯的選擇。

  2.在php.ini中開啟magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie裡的引號變為斜杠。magic_quotes_runtime對於進出資料庫的資料可以起到格式話的作用。其實,早在以前注入很瘋狂時,這個參數就很流行了。

  3.在使用系統函數時,必須使用escapeshellarg(),escapeshellcmd()參數去過濾,這樣你也就可以放心的使用系統函數。

  4.對於跨站,strip_tags(),htmlspecialchars()兩個參數都不錯,對於使用者提交的的帶有html和php的標記都將進行轉換。比如角括弧"<"就將轉化為
"<"這樣無害的字元。

  5.對於相關函數的過濾,就像先前的include(),unlink,fopen()等等,只要你把你所要執行操作的變數指定好或者對相關字元過濾嚴密,我想這樣也就無懈可擊了。

  伺服器安全設定

  談伺服器安全設定,我覺得很不實際的,我們大多數人都用虛擬機器主機,對於php.ini怎麼設,那個只有網管自己看著辦了。不過我還是說下,

  1.設定“safe_mode”為“on”

  這對於廣大空間商來說是一個偉大的選項,它能極大地改進PHP的安全性。

  2.禁止“open_basedir”
,這個選項可以禁止指定目錄之外的檔案操作,還能有效地消除本地檔案或者是遠程檔案被include()等函數的調用攻擊。

  3.expose_php設為off ,這樣php不會在http檔案頭中泄露資訊.

  4.設定“allow_url_fopen”為“off” 這個選項可以禁止遠程檔案功能,極力推薦

  5“log_errors”為“on” 錯誤日至得帶上吧

  6.對於“display_errors,register_globals”兩項要視情況而定了,display_errors太消極了,錯誤全關,想調試指令碼都不行。至於register_globals(全域變數)把它開起來,關了會很麻煩,現在大多數程式沒它支援就別想用了。

 

/////////////////////////////////////////////////////////////

 

二、加固PHP,以增強安全性。

  注意,下面的安全性要因情況而定,所以我已經把它們的功能寫清楚了,如果有問題的話,看看是否由於下面哪種限制條件所造成,可相應將其注釋掉。

  下面我們開始加固php,我們再次編輯/etc/php5/apache2/php.ini檔案,之所以沒有一次改完,主要是為了給大家一個清晰的思路。

  1.開啟安全模式,開啟他的好處就是PHP檔案只能訪問所有者和PHP檔案所有著一樣的檔案,即使在chroot環境下也無法訪問jail中屬主不一樣的檔案,類似於php
shell這樣的後門就沒用武之地了哦,phpshell是很流行的php後門,他可以執行系統命令,就象他的名字一樣,和shell很接近。

  safe_mode = On

  2.下面的設定就限制了fopen(),
file()等函數可以操作的目錄範圍,避免了入侵者非法讀取檔案,一定要在/var/www後面加"/",否則/var/wwww下的檔案也能被訪問
。該選項會禁止任何不在/var/www/目錄下的PHP檔案運行,包括任何以軟連結方式鏈到/var/www/目錄下的程式,如PhpMyAdmin包,就在該選項設定後無法正常運行。

 open_basedir = /var/www/

  3.禁止使用phpinfo和get_cfg_var函數,這樣可以避免泄露服務資訊,一般在在確認PHP能正常工作之後再使之關閉

  disable_functions = phpinfo,get_cfg_var

  4.設定php程式錯誤記錄檔

 error_reporting = E_ALL
  log_errors = On
  error_log =
/var/log/php_err.log

  5.如果php程式沒有指明需要register_globals的話,最好把register_globals設定為Off,這樣可以避免很多安全問題的。注意,如果你的程式是需要register_globals的話,可千萬別關。Ubuntu預設是關閉的。

  register_globals = Off

  6.禁止開啟遠程地址,記得最近出的php
include的那個漏洞嗎?就是在一個php程式中include了變數,那麼入侵者就可以利用這個控制伺服器在本地執行遠端一個php程式,例如phpshell,所以我們關閉這個。

 allow_url_fopen = Off 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.