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