PHP編程函數安全篇_php技巧
來源:互聯網
上載者:User
對於我們想做web安全的人來說,最好就是拿來學習,可是萬物抓根源,我們要的不是魚而是漁。在國內,各種各樣的php程式1.0版,2.0版像雨後春筍一樣的冒出來,可是,大家關注的都是一些著名的cms,論壇,blog程式,很少的人在對那些不出名的程式做安全檢測,對于越來越多的php程式員和站長來說,除了依靠伺服器的堡壘設定外,php程式本身的安全多少你總得懂點吧。
有人說你們做php安全無非就是搞搞注入和跨站什麼什麼的,大錯特錯,如果這樣的話,一個magic_quotes_gpc或者伺服器裡的一些安全設定就讓我們全沒活路了:(。我今天要說的不是注入,不是跨站,而是存在於php程式中的一些安全細節問題。OK!切入正題。
注意一些函數的過濾
有些函數在程式中是經常使用的,像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指定為某個檔案提交,就發生了原代碼泄露。就像這樣。
$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的管道參數,可以執行多條命令。)
到這裡,常見的漏洞類型應該知道點了吧。
所以一定不要只指望伺服器端的設定,最好背景程式也需要注意下,一般情況下通過伺服器針對某個網站設定應該能好點。但很多與資料庫的操作等就不是這麼容易控制了。