現(xiàn)在基于web的攻擊一般都是注入。導(dǎo)致注入的原因一般為對變量的過濾不完全,從而可以使入侵者非法執(zhí)行程序或查詢修改任意數(shù)據(jù)。隨著注入攻擊的愈演愈烈,一些專門的過濾代碼應(yīng)運而生。但一些過濾代碼的不完善很可能導(dǎo)致新的攻擊。下面就以目前應(yīng)用最廣泛的過濾代碼--SQL通用防注入程序為下列說明漏洞的成因、利用方法及防范措施。
SQL通用防注入程序是由火狐的楓知秋編寫的,功能相當完善的防注入代碼。它能對定義的過濾字符實現(xiàn)get提交的過濾,并能記錄攻擊者的IP提交的數(shù)據(jù)信息。使用時只須在要防注入的文件頭中加入代碼<--#Include File="WrSky_Sql.Asp"-->可以實現(xiàn)對變量的過濾。如果在數(shù)據(jù)庫連接文件(如conn.asp)后加入程序代碼,則可以實現(xiàn)整站的變量過濾,從而達到防注入的效果。
好了,下面我們先來看變量過濾部分的代碼:
'--------定義部份------------------
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向服務(wù)器提交的數(shù)據(jù)中包含被過濾字符,都會被程序禁止。這就導(dǎo)致了一個問題,如果是在論壇的數(shù)據(jù)庫連接文件后加入程序代碼,發(fā)貼時只要貼子內(nèi)容包括被過濾的字符就會被禁止掉。根據(jù)默認的過濾內(nèi)容看來,如果發(fā)帖子內(nèi)容為英文似乎是幾乎無法發(fā)表的。另外,在定義論壇風(fēng)格時有時會要用一些特殊字符(如百分號“%”)如果這些特殊字符被過濾的對象,那么整個論壇就不能正常運行了。對上面提到的問題,我用dvbbs做過測試,結(jié)果與我猜想的是完全一致的。
解決上述問題的方法是只在需要過濾的文件中防注入連接語句。但這樣工作量比較大,而且一般站長是不知道什么文件需要過濾的。因此我的建議是把過濾代碼加到con
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={Microsoft
新聞熱點
疑難解答
圖片精選