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