李壽財(cái) 馬秀峰
校園網(wǎng)的安全穩(wěn)定與所用技術(shù)是分不開的,由于ASP技術(shù)入門門檻不高,所以校園網(wǎng)一般都是用ASP技術(shù)來架構(gòu)的。由于開發(fā)人員的技術(shù)水平參差不齊,致使一部分程序存在安全隱患,導(dǎo)致網(wǎng)站數(shù)據(jù)被修改、刪除等現(xiàn)象。筆者在對(duì)學(xué)校網(wǎng)站兩年多的開發(fā)和維護(hù)過程中,發(fā)現(xiàn)了很多這樣的問題,其中大部分為SQL注入。
一、SQL注入原理
SQL攻擊的根源在于,程序命令和用戶數(shù)據(jù)之間沒有做到?jīng)芪挤置?。這使得攻擊者有機(jī)會(huì)將程序命令看成是用戶輸入的數(shù)據(jù)提交給Web程序,以發(fā)號(hào)施令,為所欲為。為了SQL攻擊,攻擊者需要在常規(guī)輸入中混入將被解釋為命令的“數(shù)據(jù)”。
SQL注入能使攻擊者繞過認(rèn)證機(jī)制,完全控制遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù)。SQL是結(jié)構(gòu)化查詢語(yǔ)言的簡(jiǎn)稱,它是訪問數(shù)據(jù)庫(kù)的事實(shí)標(biāo)準(zhǔn)。目前,大多數(shù)Web應(yīng)用都使用SQL語(yǔ)句來操縱存放在數(shù)據(jù)庫(kù)中的數(shù)據(jù)。幾乎所有的Web應(yīng)用在后臺(tái)都使用某種SQL數(shù)據(jù)庫(kù)。跟大多數(shù)語(yǔ)言一樣,SQL語(yǔ)法允許數(shù)據(jù)庫(kù)命令和用戶數(shù)據(jù)混雜在一起。如果開發(fā)人員不細(xì)心的話,用戶數(shù)據(jù)就有可能被解釋成命令,這樣遠(yuǎn)程用戶不僅能向Web應(yīng)用輸入數(shù)據(jù),而且還可以在數(shù)據(jù)庫(kù)上執(zhí)行任意命令。
二、判斷SQL注入的方法
SQL注人是通過在地址欄中附加一些代碼,使服務(wù)器執(zhí)行這些SQL語(yǔ)句來實(shí)現(xiàn)的。一般的文章管理系統(tǒng)、下載系統(tǒng)、論壇、留言本、相冊(cè)等都會(huì)有個(gè)發(fā)布信息的頁(yè)面,例如show.asp?id=,這說明此頁(yè)面正在調(diào)用SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)的信息。一般而言,SQL語(yǔ)句原貌大致如下:
select * from 表名 where 字段=xx
如果這個(gè)show.asp對(duì)后面的id整型參數(shù)無過濾,就可能存在SQL注入漏洞。一般使用經(jīng)典的1=1和1=2測(cè)試方法來判斷SQL注入漏洞是否存在。例如在網(wǎng)址http://www.xxx.com/show.asp?id=35后加上and 1=1后, show.asp運(yùn)行正常,而且與http://www.xxx.com/show.asp?id=35得到的頁(yè)面相同;在http://www.xxx.com/show.asp?id=35 后加上 1=2, show.asp運(yùn)行異常。到這里基本上可以斷定頁(yè)面是否存在SQL注入漏洞。
三、解決SQL注入的方法
黑客是通過不斷的試誤進(jìn)行逐層突破。防止一般的SQL注入有以下三種方法。
1.在需要防范注入頁(yè)面加入防注入系統(tǒng)程序
一般ASP程序在調(diào)用數(shù)據(jù)庫(kù)信息前需要建立數(shù)據(jù)庫(kù)鏈接,負(fù)責(zé)數(shù)據(jù)庫(kù)鏈接的程序代碼一般都保存在一個(gè)ASP文件中,同時(shí)這個(gè)文件一般以“!--#include file=”conn.asp”--”的形式被其他ASP程序調(diào)用。所以,我們可以通過在這個(gè)數(shù)據(jù)庫(kù)鏈接文件內(nèi)容前加上下面的防注入代碼,來達(dá)到防止別人進(jìn)行注入。
SQL_injdata=":|;|>|<|--|sp_|xp_||dir|cmd|^|(|)|+|$|'|copy|format|and|exec|insert|select|delete|update |count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "SQL通用防注入系統(tǒng)"
Response.end
end if
next
Next
End If
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "SQL通用防注入系統(tǒng)"
Response.end
end if
next
next
End If
2.修改數(shù)據(jù)庫(kù)中的用戶名和密碼字段及后臺(tái)頁(yè)面的名稱
通過SQL注入分析器可以輕松跳過防注入系統(tǒng)并自動(dòng)分析其注入點(diǎn)。找到注入點(diǎn)后,黑客會(huì)不斷地對(duì)用戶名和密碼進(jìn)行推測(cè),推測(cè)出正確的用戶名和密碼后,他們還會(huì)不斷地猜測(cè)用戶的后臺(tái)登錄頁(yè)面名稱。鑒于此,筆者建議校園網(wǎng)管理人員把數(shù)據(jù)庫(kù)的用戶名和密碼字段及后臺(tái)頁(yè)面改為不太常用的名稱,另外,不要把后臺(tái)登陸頁(yè)面的超鏈接放到主頁(yè)面上。
3.雙賬號(hào)策略
某些強(qiáng)大的SQL注入分析器不僅可以輕松分析注入點(diǎn),還可以分析網(wǎng)站的管理員賬號(hào)及密碼。既然無法逃過檢測(cè),那我們就做兩個(gè)賬號(hào),一個(gè)是普通的管理員賬號(hào),一個(gè)是防止注入的賬號(hào)。雙賬號(hào)策略的具體方法是首先將管理員的賬號(hào)字段的數(shù)據(jù)類型進(jìn)行修改,文本型改成最大字段255或選擇備注型,密碼的字段也進(jìn)行相同設(shè)置。其次將這個(gè)普通管理員賬號(hào)放到數(shù)據(jù)表中第一行并輸入大量中文字符。最后,把真正的防注入的SQL賬號(hào)放入第二行后的任意位置。
通過上面的三種策略初步完成了SQL注入攻擊的防范,基本杜絕了ASP程序被惡意SQL注人數(shù)據(jù)所帶來的危害。
(作者單位:山東日照市曲阜師范大學(xué)信息技術(shù)與傳播學(xué)院)