胡華海 王新宇
摘 要:PHP作為當前最流行的動態網頁的設計語言之一,并且在網絡環境中很多PHP語言開發出的腳本語言都是開源的,但PHP語言和其他語言一樣也存在些漏洞,接下來我將從代碼分析的角度來分析PHP中存在的一些安全漏洞。
關鍵詞:PHP;XSS攻擊;SQL注入
在涉及apache服務器系統安全問題方面我們不在深入分析,我們主要是來介紹PHP中存的漏洞問題及解決方案。PHP存在的漏洞比較多,我們不一一列出,在這里我們主要找了一些代表性的案例,每種漏洞都有相應的解決方法,接下來我將對目前常見的以下幾種漏洞提出自已的一些解決方案。
一、PHP程序開發中存在的漏洞
ecshop最新版本存儲XSS至后臺。
這個漏洞是利用定單處理頁面:flow.php的填寫收貨人地址頁面沒有對郵件進行有效的過濾,導致管理員在后臺的訂單頁。
比如我們在郵件框中輸入:
" onmouseover="$import('http://www.gongJiDeJS.com/test.js','js')" "
其它內容填好,雖然在在init.php文件中會進行一個addslashes但寫入數據庫后內容就恢復輸入的內容了。
這種漏洞雖然在客戶端用了JS判斷郵件合法性但客戶端JS可以關閉,所發在開發時不要太相信客戶端的JS判斷。JS只是一個增加客戶體驗,不能完全相信提交過來的數據。尤其是攻擊者,他們會想提交各種攻擊串來達到目的。
程序在使用這些數據時也不能只通過addslashes來添加轉義。要嚴格判斷提交數據的合法性,如郵件必須判斷為正確的格式,顯示的文本要判斷是否有script標簽或其它的引入文件標簽防止加載攻擊JS代碼丟失客戶或管理員的COOKIE。包含html標簽的都轉換為HTML特殊符號轉義等。盡量不要直接使用。
(一)ecshop最新版本SQL注入+存儲XSS=任意管理員登錄。
這個漏洞是利用站外廣告統計處理頁面:affiche.php的from參數傳入SQL,直接寫入數據庫ecs_adsense中在后臺管理員進入 報表統計 -> 站外投放JS 菜單時該頁面又沒有對這個參數進行過濾便使用到第二個SQL中很容易形成了“二次注入”。
同第一個類似,可以方便的獲取管理員的COOKIE,如果這個時候你知道了該系統的表前綴,還可以進行SQL注入獲取管理員的密碼。
當然還有其它可用的SQL來注入,獲取想要的內容,比如系統配置數據等。這種漏洞完全是程序沒有對提交的數據進行過濾,雖然的客戶端沒有什么影響,但管理員進入后臺時,打開對應的頁面就會執行攻擊者想要的操作,如果攻擊者能及時得到管理員的COOKIE就可以進入后臺管理,達到攻擊的目的。來源地址中說解決方案是 addslashes, 輸出時過濾 雖然解決了問題但不完善,應該從輸入時就過濾,去掉不合法的地址。
(二)ecshop最新版本一處用戶權限越權。
這個漏洞是利用了頁面中的隱藏表單元素。強制修改里面的值來破壞數據庫里的記錄。
ecshop里的用戶可以修改自己的配送地址,但存在著address_id隱藏域,只要動修改下里面的值進行循環就可以清空或修改所有其它用戶的配送地址。
主要的是修改配送地址的程序沒有做用戶判斷,而直接用了配送ID篩選,使用的程序是:
/includes/lib_transaction.php 516行,save_consignee方法
if ($consignee['address_id'] > 0)
{
/* 修改地址 */
$res = $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('user_address'), $consignee, 'UPDATE', 'address_id = ' . $consignee['address_id']); //看,沒判斷user_id吧?
}
雖然這個漏洞不能獲取管理員的數據,但是可以破壞用戶的配送地址。極其不安全。這個漏洞利用的是SQL查表篩選條件不足,在修改配送地址時沒有以用戶ID加配送ID進行篩選,只用到了配送ID,如果我們修改配送ID那就可以直接修改其它不屬于該用戶的配送數據,一斷循環那就會影響整個配送表的數據,因此在查表時一定要做好篩選,尤其是接受提交數據進行篩選,能進行用戶ID的一定要加上去,避免類似漏洞發生,同樣要對這個提交過來的篩選內容進行過濾,能為數字一定要強制轉換下等。
二、結語
這里所能說明的是大部分PHP程序漏洞是沒有對用戶提交來的數據進行驗證導致的,所以對客戶提交的所有數據進行適當的驗證轉換是網站安全的基本,如果是數值的一定要強制轉換為對應的數值類型,如果是字符串的一定要加addslashes處理下,郵箱一定要進行匹配驗證,如果要做二次查詢SQL時并且使用到用戶提交過來的數據(字符串類的)一定要再加一次addslashes才能進入SQL中,否則容易產生二次注入,如果要顯示客戶提交過來的文本類數據要進行htmlentities轉換HTML實體字符,解決掉XSS攻擊的可能,如果特殊情況不能去掉HTML實體字符,那必須處理好JS的引入操作,查找出一些script、標簽和一些JS事件。
參考文獻:
[1] 陳益材,等.PHP+MySQL+Dreamweaver 動態網站建設從入門到精通(附多媒體語音教學光盤).環博文化組.機械工業出版社.2012,6.
[2] 楊宇.PHP典型模塊與項目實戰大全[M].清華大學出版社,2012,1.
[3] 陳湘揚,陳國益. PHP5+MySQL網頁系統開發設計[M].北京:電子工業出版社,2007,5.
[4] 宋正榮.基于PHP-MVC的Struts標簽的實現[D].銅陵學院報,2005,4.