蘇 乾,侯 俊
(上海理工大學 光電信息及計算機工程學院,上海 200093)
?
基于Web的酒店點評系統(tǒng)安全測試研究
蘇 乾,侯 俊
(上海理工大學 光電信息及計算機工程學院,上海 200093)
為防范基于Web應用程序的漏洞攻擊,文中對一個Web頁面的酒店點評系統(tǒng)安全性能進行了測試。研究了該酒店點評系統(tǒng)在運行中各個環(huán)節(jié)上出現(xiàn)的Web應用程序漏洞。針對其中3種主要漏洞:SQL注入、跨站腳本攻擊及跨站請求偽造,根據(jù)其產(chǎn)生原理和攻擊過程,提出了過濾特殊字符和加密關(guān)鍵傳遞參數(shù)的防御方法,并給出相應的程序代碼。測試結(jié)果顯示,該酒店點評系統(tǒng)能有效地防范Web應用程序漏洞,提高了系統(tǒng)的安全性。
Web酒店點評系統(tǒng);SQL注入;跨站腳本攻擊;跨站請求偽造
漏洞是指信息系統(tǒng)中的軟件、硬件或通信協(xié)議中存在缺陷或不適當?shù)呐渲?,從而可使攻擊者在未授?quán)的情況下訪問或破壞系統(tǒng),導致信息系統(tǒng)面臨安全風險[1]。2014年,CNVD(國家信息安全漏洞共享平臺)收集新增漏洞9 163個,包括高危漏洞2 394個(占26.1%),中危漏洞6 032個(占65.8%),低危漏洞737個(占8.1%)。最新數(shù)據(jù)顯示,僅2015年11月,CNVD共協(xié)調(diào)處置了2 311起涉及我國政府部門以及銀行、民航等重要信息系統(tǒng)部門以及電信、傳媒、公共衛(wèi)生、敃育等相關(guān)行業(yè)的漏洞事件[2],可見對Web漏洞的研究和防范迫在眉睫。
本文設(shè)計了一個用php實現(xiàn)的Web酒店用戶評論展示系統(tǒng),基本頁面展示近期用戶點評,允許用戶在游客狀態(tài)下填寫評論后發(fā)表,經(jīng)系統(tǒng)過濾保存評論內(nèi)容后在頁面展示,另外選擇管理員登陸,在驗證賬號密碼后可執(zhí)行對點評的刪除等操作,該系統(tǒng)功能實現(xiàn)流程如圖1所示。
圖1 實現(xiàn)功能流程圖
該系統(tǒng)的點評留言功能及登錄功能在互聯(lián)網(wǎng)上得到了廣泛應用,同時也存在多處高危漏洞,這些漏洞引起的安全隱患,會暴露用戶的詳細信息、允許惡意用戶執(zhí)行任意的數(shù)據(jù)庫查詢,甚至允許通過遠程命令行訪問服務(wù)器,從而造成對Web 應用程序的破壞或用戶隱私信息被竊取。本文分析漏洞出現(xiàn)的原理,對該酒店點評系統(tǒng)進行測試,改進代碼,以實現(xiàn)能對漏洞進行防范的功能。
SQL注入(SQL Injection)攻擊是指惡意用戶輸入用來影響被執(zhí)行的SQL腳本[3]。由于Web端應用程序沒有對用戶輸入數(shù)據(jù)的合法性進行判斷,數(shù)據(jù)服務(wù)器運行惡意SQL命令后,通過和數(shù)據(jù)庫交互從而獲得私密信息,因此使數(shù)據(jù)庫信息遭到破壞。
一種腳本注入式的攻擊方式是攻擊者在Web頁面的輸入?yún)^(qū)域,如表單的輸入?yún)^(qū)域或頁面請求查詢的字符串,輸入別有用心構(gòu)造的SQL語句插入特殊字符和指令,提交后的數(shù)據(jù)會被數(shù)據(jù)服務(wù)器誤認為是將要執(zhí)行的指令語句。
在本酒店點評系統(tǒng)中,管理員需在Web應用程序的登錄驗證(login)頁面登陸后才能對用戶點評進行刪除等操作, 管理員需要輸入用戶名(username)以及對應的密碼(password)進行登錄操作,應用程序通過用戶提交的這兩個參數(shù)來進行操作,其原理是通過查找原本建立好userstable中的用戶名(username)和匹配密碼(password)的結(jié)果進行授權(quán)訪問,經(jīng)典的SQL指令形式為
select*from userstable where username=’admin’ and password=’admin’
若攻擊者給username賦值“abc’ or 1=1 -- ”,將其輸入提交給服務(wù)器后,服務(wù)器將執(zhí)行由其構(gòu)造出來的指令,SQL指令形式變成
select*from userstable where username=’abc’ or 1=1 -- and password=’abc’
該語句中執(zhí)行了兩個判斷,只要其中一個條件成立,則返回正確的授權(quán),同時由于語句中的“1=1”在邏輯上是永遠成立的,“--”表示后面所有的語句為注釋語句,因此這語句是恒成立的,導致應用程序不能正確驗證用戶身份,會錯誤授權(quán)攻擊者訪問。
為了防范此類攻擊方式,系統(tǒng)采用對輸入用戶名信息進行過濾的方法,其詳細代碼如下
Function Inputcheck()
{ if (instr(request(“$username”),”’”)>0 or instr(request(“$username”),”or”)>0) then
reponse.write””
response.end
end if
}
此段功能函數(shù)對輸入的用戶名當中是否含有“’”和“or”字符進行識別,若存在非法字符則返回相關(guān)提示,以防止用戶惡意利用此漏洞獲得管理員登錄權(quán)限。
另一種攻擊方式是基于當一個查詢指令被拒絕后,數(shù)據(jù)庫會返回包含有調(diào)試信息的錯誤消息,從而使攻擊者可通過返回的信息得到應用程序的數(shù)據(jù)庫以及漏洞參數(shù)。通常通過輸入不匹配的URL進行攻擊,如
正確URL:http://www.hotel.com/manage/?id =2
SQL注入:http://www.hotel.com/manage/?id =2’
此時如果應用程序返回錯誤信息
Select name FROM userstable WHERE id=2’
則攻擊者可從返回的信息中得到:username、userstable、id字段名等私密信息從而進行更為精確的漏洞攻擊。為防范此類型的漏洞攻擊,需要對HTTP請求的參數(shù)進行檢測,本系統(tǒng)中添加了一段用于過濾請求參數(shù)的代碼,存儲于一個公共的php文件中便于其他文件的調(diào)用,其代碼如下
foreach($_POST as $post_sql>=$post_post)
{ if(is_numeric($var_getvalues))
$_POST[strtolower($post_sql)] = intval($post_post);
else
$_POST[strtolower($post_sql)] = addslashes($post_post);
}
foreach($_GET as $get_sql>=$get_get)
{ if(is_numeric($var_getvalues))
$_GET[strtolower($get_sql)] = intval($get_get);
else
$_GET[strtolower($get_sql)] = addslashes($get_get);
}?>
當用戶向訪問的Web頁面提交參數(shù)時,通過上述代碼,利用intval()與addslashes()分別對提交的數(shù)據(jù)信息$_POST和$_GET中的整形參數(shù)及字符型參數(shù)進行轉(zhuǎn)換,能有效地防止SQL參數(shù)注入的攻擊。
SQL注入漏洞對Web應用造成損壞巨大,同時也有相應的檢查措施,分為入侵前的檢測和入侵后的檢測。入侵前的檢測可通過手工方式,也可使用SQL注入軟件,主要目的是為了預防SQL注入攻擊。而對于入侵后的檢測,主要是查看審計日志,SQL注入漏洞攻擊成功后,會在IIS日志和數(shù)據(jù)庫中留下“痕跡”。比如在Web服務(wù)器中啟用日志記錄,則IIS日志會記錄下訪問者的IP地址等信息,SQL注入通常會大量訪問一個頁面,通過查看日志文件的大小以及日志內(nèi)容便可判斷是否曾經(jīng)發(fā)生SQL注入攻擊[4]。
對SQL注入的防御措施,主要從檢驗提交信息的有效性入手,主要總結(jié)如下幾個方面:限制數(shù)據(jù)輸入及查詢字符的長度,檢測關(guān)鍵字和特殊字符;將用戶輸入的危險字符進行過濾或轉(zhuǎn)義;去除代碼中的敏感信息;對數(shù)據(jù)信息進行封裝和加密處理;指定錯誤返回頁面以及限制數(shù)據(jù)庫的訪問權(quán)限等。
HTML是Web頁面的一種基本描述語言,同時HTML中也可嵌入其他的腳本語言,比如“”。當瀏覽器遇到起始標簽[5]。若用戶填寫了相關(guān)的內(nèi)容提交,若沒有相應的過濾,就會導致跨站腳本XSS(Cross-Site Scripting Attack)漏洞的出現(xiàn)[6]。
在本文的酒店點評系統(tǒng)中,發(fā)表點評功能對游客狀態(tài)的用戶開放,用戶在填寫點評后點擊發(fā)表,隨后將保存的點評展示在點評列表中,但若用戶惡意輸入一些腳本語言代碼,例如:,而系統(tǒng)沒有對點評內(nèi)容沒有過濾,點擊發(fā)表評論后,系統(tǒng)并沒有把用戶輸入的代碼顯示在點評列表上,而是已執(zhí)行Java腳本語句的方式彈出消息框提示“warning!”。
[7],XSS的實現(xiàn)過程如圖2所示。
圖2 XSS漏洞攻擊流程
根據(jù)HTML頁面引用用戶輸入的形式,XSS攻擊大致分為3類:存儲型的XSS、反射型的XSS和基于DOM的XSS[8-9]。
存儲型的XSS(stored XSS),最常檢測的到漏洞出處就是類似留言、評論這種Web頁面。攻擊者通常直接將腳本代碼輸入到被攻擊Web站點的表格中,當其他用戶來訪問這個頁面時,輸入的腳本并非以靜態(tài)數(shù)據(jù)顯示,而是作為指令代碼開始執(zhí)行。
唐山市21個水功能區(qū)中10個水功能區(qū)設(shè)為禁止設(shè)置入河排污口水域:大黑汀水庫水源地保護區(qū);潵河河北承德、唐山保留區(qū);沙河河北秦皇島飲用水源區(qū);龍灣河河北唐山飲用水源區(qū);泉水河河北唐山飲用水源區(qū);陡河河北唐山飲用水源區(qū);還鄉(xiāng)河河北唐山飲用水源區(qū)1;引灤專線天津水源地保護區(qū)1;小青龍河北唐山農(nóng)業(yè)用水區(qū);還鄉(xiāng)河河北唐山飲用水源區(qū)2。
反射型XSS(reflected XSS),就是將腳本文件嵌入到URL地址的CGI參數(shù)中,攻擊者將鏈接發(fā)送給潛在的受害者;當受害者點擊鏈接時,頁面被下載,但其中的內(nèi)容被嵌入在URL中的腳本修改了。在此過程中,只有用戶在點擊了被篡改過的鏈接時,頁面載入過程中才執(zhí)行完成。
基于DOM 的XSS攻擊,其是通過修改Web頁面DOM節(jié)點數(shù)據(jù)信息而形成的漏洞攻擊。例如一段JavaScript代碼訪問一個URL請求參數(shù)并使用此信息添加到自己的頁面,但這個信息未使用HTML的實體編碼,就可能出現(xiàn)XSS漏洞。
XSS攻擊所攻擊的主要目標并不是Web服務(wù)器本身,而是登錄網(wǎng)站的用戶,其一般不會奪取訪問Web服務(wù)器的管理權(quán)限,XSS攻擊的目的是:(1)劫持用戶的Web行為,監(jiān)視瀏覽歷史、表單輸入、發(fā)送接受的數(shù)據(jù),或?qū)⒛繕苏军c重新定向到釣魚網(wǎng)站;(2)竊取用戶Cookie,獲取用戶身份,從而獲得對網(wǎng)站的操作權(quán)限;(3)目前最多的XSS蠕蟲攻擊,可用來打廣告、刷流量、掛木馬、破環(huán)網(wǎng)站數(shù)據(jù)等[10]。
因此,需要在發(fā)表點評的系統(tǒng)中加入能有效防御XSS漏洞的手段,本例采用str_replace()函數(shù)對頁面的輸入輸出內(nèi)容中的特殊字符進行編碼,代碼如下
FUNCTION code_filter($cMyString)
{ $cMyString = trim($cMyString);
$cMyString = str_replace(“"”,”””, $cMyString);
$cMyString = str_replace (“@ 额济纳旗| 谢通门县| 彭州市| 千阳县| 南皮县| 闸北区| 平阳县| 郸城县| 景德镇市| 麻江县| 祥云县| 甘谷县| 上思县| 拉萨市| 静宁县| 岚皋县| 华阴市| 新乡县| 房产| 贺兰县| 新疆| 翁源县| 建始县| 桓台县| 奉新县| 克东县| 北安市| 荃湾区| 阆中市| 莆田市| 旅游| 富顺县| 东海县| 时尚| 廊坊市| 溧水县| 禄丰县| 徐州市| 东乌| 广饶县| 靖西县|