摘 要:利用腳本漏洞測試系統(tǒng)搭建了SQL注入漏洞實驗平臺,在平臺上對SQL注入進行了分析和防范,結合Cookies注入突破了系統(tǒng)防護程序的保護,最后給出了Cookies注入的防護措施。
關鍵詞:漏洞測試;SQL注入;Cookies注入;防護措施
1 引言
隨著網(wǎng)絡安全技術的不斷發(fā)展,SQL注入攻擊作為最常見的攻擊方式被越來越多的人所知曉。Web安全與數(shù)據(jù)庫安全研究組織(OWASP:Open Web Application Security Project)提供的OWASP_TOP10_WEB[1]安全報告中指出,Web應用程序中最常見、最危險的安全威脅就是SQL注入漏洞。
2 SQL注入分析與防范
利用網(wǎng)絡上免費的腳本漏洞測試系統(tǒng)搭建SQL注入漏洞實驗平臺(Asp+Access),經(jīng)過典型的SQL注入測試發(fā)現(xiàn)在該系統(tǒng)的/news.asp?id=1地方存在注入漏洞,代碼如下:
從代碼中可以看到news.asp文件中通過request(\"id\")方式獲取客戶端提交的數(shù)據(jù),并且對于客戶端傳遞過去的參數(shù)id系統(tǒng)沒有做任何處理就直接傳遞給了sql語句,形成了典型的SQL注入漏洞。客戶端可以手工或借助工具完成系統(tǒng)的SQL注入測試。
但腳本漏洞測試系統(tǒng)的include 文件夾中存在safe.asp文件,該程序是為了對客戶端提交的數(shù)據(jù)進行驗證和過濾,判斷是否存在非法字符,可以在news.asp中包含此文件以防止系統(tǒng)被直接SQL注入,代碼如下:
分析代碼可以看到,程序對通過GET、POST方式提交的數(shù)據(jù)利用“黑名單”進行了過濾,根據(jù)特征字符串去過濾掉一些危險的字符,常規(guī)檢測SQL注入漏洞的手段很難繞過防注入程序。
3 Cookie注入形成與攻擊
ASP腳本中的request對象被用來獲取客戶端提交的數(shù)據(jù),ASP開發(fā)文檔中對Request對象描述,當瀏覽器向服務器請求頁面時,這個行為就被稱為一個Request(請求)[2]。Request對象的使用方法為:Request.[集合名稱](參數(shù)名稱),但ASP中規(guī)定可以省略集合名稱。當使用Request(\"參數(shù)名稱\")方式獲取數(shù)據(jù)時,ASP規(guī)定按照QueryString、Form、Cookies、ServerVariables集合的順序來搜索存取,通過提交cookie的方式來提交變量的值,從而發(fā)起注入攻擊,這種攻擊方式被稱之為 Cookie注入[3]。
從腳本漏洞測試系統(tǒng)的safe.asp文件中可以看到,程序對GET、POST方式提交的數(shù)據(jù)進行過濾,但是沒有對使用request.cookies(\"參數(shù)名稱\")方式提交的數(shù)據(jù)進行過濾,因此程序在該處形成了Cookie注入攻擊,利用下面的Cookie注入過程進行測試攻擊[4]。
⑴尋找類似“/news.asp?id=1”的帶參數(shù)的URL地址,去掉“id=1”查看頁面顯示是否正常,如果出現(xiàn)異常,說明參數(shù)id=1在數(shù)據(jù)傳遞中是起到直接作用。
⑵清空瀏覽器地址欄,輸入“javascript:alert(document.cookie=\"id=\"+escape(\"1\"));”,回車確認,在彈出的對話框中顯示id=1。
⑶重復上述步驟,將經(jīng)典SQL注入判斷語句\"and 1=1\"和\"and1=2\"寫入提交的字符串中, “javascript:alert(document.cookie=\"id=\"+escape(\"1 and 1=1\"));”
和“javascript:alert(document.cookie=\"id=\"+escape(\"1 and 1=2\"));”。如果分別返回正常和不正常頁面,則說明該處可能存在注入漏洞,可以進行cookies注入。
(4)在Cookies注入的基礎上手工或借助工具來完成系統(tǒng)的注入攻擊。
4 防范與總結
通過分析漏洞測試系統(tǒng)中的代碼,確定SQL注入漏洞產(chǎn)生的原因在于:程序是通過request(\"id\")方式獲取客戶端提交的數(shù)據(jù),并且在防注入程序safe.asp中沒有對通過request.cookies方式提交的數(shù)據(jù)進行過濾[4]。
因此,在開發(fā)和設計Web應用程序過程中對于客戶端的輸入必須進行校驗[5],在獲取客戶端提交的數(shù)據(jù)時指明數(shù)據(jù)提交方式,可以采用Request.QueryString(\"id\")方式來獲取通過GET方式提交的數(shù)據(jù),防止通過Request.Cookies(\"id\")數(shù)據(jù)提交方式注入。
對客戶端HTML提交的輸入信息進行URL解碼,防止通過URL編碼的方式構造SQL命令用來欺騙SQL防注入檢測模塊;使用正則表達式來驗證輸入信息中是否包含特殊字符并檢測輸入?yún)?shù)信息的長度是否超過預設的閾值。
[參考文獻]
[1]OWASP.The Ten Most Critical Web ApplicationSecurityRisks[R],http://www.owasp.org/images/0/0f/OWASP_T10_-_2010_rc1.pdf.2012-10.
[2]W3school.ASP Request 對象[EB/OL].http://www.w3school.com.cn/asp/asp_ref_request.Asp.2013-10-1.
[3]朱遠文,張煜,常暢,等.基于Cookie的安全防護技術研究[J].信息網(wǎng)絡安全.2012,9:46-49.
[4]瑞星網(wǎng).Web攻防系列教程之Cookie注入攻防實戰(zhàn).[EB/OL].http://www.rising.com.cn/news letter/news/2012-08-23/12195.html.2013-10-1.
[5]褚誠云.跨站腳本XSS安全漏洞[J].程序員.2008,11:97-99.