摘要:該文簡要介紹了SQL注入攻擊的原理,并針對SQL注入的方法,給出了SQL注入攻擊的防御方法。
關鍵詞:ASP;SQL注入;防范技術;網絡安全
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)27-1996-02
Protective Artifice for SQL Injection Based on ASP Website
ZHANG Hao-yu,LI Ming-hao,WANG Yu-xin,SHAN Wei-wei
(Liaoning Province Meteorology Information and Technical Support Center, Shenyang 110016, China)
Abstract: The text Introduces elements of SQL Injection and advances protective artifice to aim at SQL Injection.
Key words: ASP; SQL injection; keep away; network safety
1 引言
隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由于相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
2 SQL注入原理
SQL是一種用于關系數據庫的結構化查詢語言。它分為許多種,但大多數都松散地基于美國國家標準化組織最新的標準SQL-92。SQL語言可以修改數據庫結構和操作數據庫內容。當一個攻擊者能夠通過往查詢中插入一系列的SQL操作數據寫入到應用程序中去,并對數據庫實施了查詢,這時就已經構成了SQL-Injection。所謂SQL注入(SQL Injection),就是利用某些Web應用程序對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交一段特殊的數據庫查詢代碼,根據程序返回的結果,達到收集程序、數據庫及服務器的信息,獲取想得到而通過正常途徑無法得到的資料,使整個網站服務器失控甚至對網站進行破壞性攻擊的目的。
程序存在SQL注入,追其原因,是因為代碼或者編碼的不完善。但說到底,是程序員的惰性。代碼的不完善,往往是因為在程序編寫的過程中,沒有考慮到代碼的健壯性及安全性的結果,就國內現狀來看,大多數網站使用的腳本語言,用ASP+Access或SQLServer的占70%以上,PHP+MySQL占20%,其他的不足10%,由于開發者代碼編寫的過程考慮不夠周全,往往忽略程序代碼的安全性,而使程序腳本被注入也成為必然。從攻擊者的角度來看,使用SQL注入能夠避免絕大多數防火墻的防御,不留攻擊痕跡,攻擊手法多種多樣,因此才會導致SQL注入攻擊手段的興起。
SQL注入通過網頁對網站數據庫進行修改。它能夠直接在數據庫中添加具有管理員權限的用戶,從而最終獲得系統管理員權限。黑客可以利用獲得的管理員權限任意獲得網站上的文件或者在網頁上加掛木馬和各種惡意程序,對網站的正常運營和訪問該網站的網友都帶來巨大危害。
3 SQL注入防御
SQL注入是從正常的WWW端口通過對頁面請求訪問,而且表面看起來跟一般的Web頁面訪問沒什么區別,所以目前市面的防火墻很少會對SQL注入發出警報,如果管理員沒查看IIS日志的習慣,可能被入侵很長時間都不會發覺。SQL注入的手法相當靈活,可以根據具體情況進行分析,構造巧妙的SQL語句,從而獲取想要的數據。針對SQL攻擊的防御,現在各網站經常采用的方法,主要有以下一些解決的方法:
3.1 檢驗敏感字符/字符串
有些程序員采取針對一些敏感的字符串,主要是對SQL命令或關鍵字進行處理,把它們從客戶端提交的信息中找到、刪除,并把剩余的信息默認為安全信息寫入數據庫。雖然在一定程度上有效,但有“治標不治本”的嫌疑,舉例來說明他的弱點,當客戶端的輸入為“…ccmdmcmdd…”時,在對敏感字符串“cmd”替換刪除以后,剩下的字符正好是“…cmd…”。新的攻擊方式正在被不斷發現,只要允許服務端程序使用這些提交信息,就總有受到攻擊的可能。可見這個方法是不健全的,稍加變化即可躲過檢察。
其實,最好的方法就是一旦檢測到敏感字符/字符串,只要把它們屏蔽,并針對數據庫的操作即行中止。具體代碼如下:
function RequestX(strGet)
strTemp=Request.Form(strGet)
dim nothis(16)
nothis(0)=\"net user\"
nothis(1)=\"xp_cmdshell\"
nothis(2)=\"/add\"
nothis(3)=\"exec%20master.dbo.xp_cmdshell\"
nothis(4)=\"net localgroup administrators\"
nothis(5)=\"select\"
nothis(6)=\"count\"
nothis(7)=\"asc\"
nothis(8)=\"char\"
nothis(9)=\"mid\"
nothis(10)=\"'\"
nothis(11)=\"\"\"\"
nothis(12)=\"insert\"
nothis(13)=\"delete\"
nothis(14)=\"drop\"
nothis(15)=\"truncate\"
nothis(16)=\"from\"
for i=1 to ubound(nothis)
if instr(strTemp,nothis(i)) then
Response.write \"你輸入的內容含有非法字符!\"
Response.write \"請返回重試\"
Response.End
end if
next
RequestX=strTemp
end function
將上述代碼封裝在一個asp文件中,在網頁代碼中可直接調用。對于純數字的信息傳遞,可采用數字檢驗,不是數字便停止操作。應sql注入檢測,主要過濾掉“'”。具體函數代碼如下:
Function ReqNum (StrName)
ReqNum = Request (StrName)
if Not isNumeric (ReqNum) then
Response.Write \"參數必須為數字型!\"
Response.End
End if
End Function
Function ReqStr (StrName)
ReqStr = Replace (Request(StrName), \"'\", \"''\" )
End Function
這兩個函數在頁面中直接調用即可。
3.2 查堵form或cookies的漏洞
既然攻擊者是通過form或cookies提交包含“or”和“=” 等特殊字符,那么我們的防范措施就是在這部分程序中加入檢查或過濾這些特殊字符的代碼,以實現安全目的。方法是在使用: paraname=Request.form()或paraname=Request. Cookies()獲取用戶名和密碼后加入代碼:
If instr(paraname," ")>0 or instr(paraname," or ")>0 or instr(paraname,"=")>0 or instr(paraname,"'")>0 or instr(paraname,";")>0 then
Response.Write "<Script Language=JavaScript>alert('用戶參數中含有非法字符串!'); history.back();</Script>"
Response.End
End If

含義:假如在用戶參數paraname中找到了(空格)#65380;(or)#65380;(=)#65380;(')與(;)等非法字符,就立即執行then 后的語句,終止ASP的運行,入侵者也就無法進行SQL注入了#65377;
3.3 用戶密碼加密
程序員要做的另一件事是給用戶密碼加密,一般用MD5加密較好#65377;MD5沒有反向算法,不能解密,人家即使知道經加密后存在數據庫里的像亂碼一樣的密碼,他也沒辦法知道原始密碼#65377;要注意的是,正因為MD5加密以后的信息不可以解密,如果用戶丟失密碼,任何人都很難找到用戶原來的密碼#65377;鑒于篇幅,MD5加密的具體做法請參考有關資料,這里不作闡述#65377;
3.4 屏蔽出錯信息
精心配置IIS打造一個安全Web服務器是一項科學嚴謹的工作,事關網絡安全之首要,也是服務器管理員的神圣職責,具體做法請參見有關資料#65377;針對防范SQL注入要做的主要是把IIS設置成不管出什么樣的ASP錯誤,只給出一種錯誤提示信息,即http 500錯誤,再小心設置數據庫用戶權限#65377;這樣人家就無法入侵了#65377;IIS設置詳見圖1所示#65377;首先把500:100這個錯誤的默認提示頁面C:\\WINDOWS\\Help\\iisHelp\\common\\500-100.asp改成C:\\WINDOW\\Help\\iisHelp\\Common\\500.htm#65377;
其次還應在IIS中為每個網站設置好執行權限,一般情況下有"純腳本"權限就夠了,對于那些存放網站后臺管理中心上傳文件的目錄執行權限設為“無”更好,這樣可以防止人家上傳運行ASP木馬#65377;
4 結束語
SQL注入是網絡安全領域的新事物,但發展快危害大,而且經常被一些網站開發或網頁設計人員所忽視#65377;近年來,給網站的穩定運行帶來了很大的影響,我們提高安全意識,在設計開發和網站運行的過程中隨時注意查堵SQL注入漏洞,在很大程度上提高網站的運行安全#65377;
參考文獻:
[1] 周天思,孫明麗,龐婭娟. ASP開發技術大全[M]. 北京:人民郵電出版社,2007.
[2] 薛小龍. ASP典型系統實戰與解析[M]. 北京:電子工業出版社,2007.
[3] 張友生,米安然. 計算機病毒與木馬程序剖析[M]. 北京:科海電子出版社,2003.