現在基於web的攻擊一般都是注入。導致注入的原因一般為對變量的過濾不完全,從而可以使入侵者非法執行程序或查詢修改任意數據。隨著注入攻擊的愈演愈烈,一些專門的過濾代碼應運而生。但一些過濾代碼的不完善很可能導致新的攻擊。下面就以目前應用最廣泛的過濾代碼--SQL通用防注入程序為下列說明漏洞的成因、利用方法及防范措施。
SQL通用防注入程序是由火狐的楓知秋編寫的,功能相當完善的防注入代碼。它能對定義的過濾字符實現get提交的過濾,並能記錄攻擊者的IP提交的數據信息。使用時只須在要防注入的文件頭中加入代碼<--#Include File="WrSky_Sql.Asp"-->可以實現對變量的過濾。如果在數據庫連接文件(如conn.asp)後加入程序代碼,則可以實現整站的變量過濾,從而達到防注入的效果。
好了,下面我們先來看變量過濾部分的代碼:
'--------定義部份------------------
Dim Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
'自定義需要過濾的字串,用 "楓" 分隔
Fy_In = "'楓;楓and楓exec楓insert楓select楓delete楓update楓count楓*楓%楓chr楓mid楓master楓truncate楓char楓declare"
'----------------------------------
%>
<
Fy_Inf = split(Fy_In,"楓")
'--------POST部份------------------
If Request.Form<> Then
For Each Fy_Post In Request.Form
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>Then
'--------GET部份-------------------
If Request.QueryString<> Then
For Each Fy_Get In Request.QueryString
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>Then
這段代碼中定義了對“'”“and”等常用注入變量的過濾,如果覺得過濾不夠或太多可自行增減字符。很明顯,只要通過get或post向服務器提交的數據中包含被過濾字符,都會被程序禁止。這就導致了一個問題,如果是在論壇的數據庫連接文件後加入程序代碼,發貼時只要貼子內容包括被過濾的字符就會被禁止掉。根據默認的過濾內容看來,如果發帖子內容為英文似乎是幾乎無法發表的。另外,在定義論壇風格時有時會要用一些特殊字符(如百分號“%”)如果這些特殊字符被過濾的對象,那麼整個論壇就不能正常運行了。對上面提到的問題,我用dvbbs做過測試,結果與我猜想的是完全一致的。
解決上述問題的方法是只在需要過濾的文件中防注入連接語句。但這樣工作量比較大,而且一般站長是不知道什麼文件需要過濾的。因此我的建議是把過濾代碼加到conn.asp後,然後再建一個不包含過濾代碼的connl.asp,把肯定不需要過濾且過濾代碼對本文件運行有影響的文件連接到conn1.asp,但要注意兩個數據連接文件的基本內容要保持一致。另外,在風格設置中最好不要用到過濾的字符,確實要用到的可在防注入程序中刪掉對該字符的過濾。
上面講的是防注入程序對站點運行的影響,並不能造成什麼危害。其實,真正的危害來自數據記錄部分,我們來看這部分的代碼:
''--------寫入數據庫-------頭--------
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
Set Fy_db=Server.CreateObject("ADODB.CONNECTION")
Fy_db.open Fy_dbstr
Fy_db.Execute("insert into SqlIn(Sq