現在基于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(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"','GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.close
Set Fy_db = Nothing
'--------寫入數據庫-------尾--------
Response.Write "<Script Language=javaScript>alert('楓網SQL通用防注入系統提示↓/n/n請不要在參數中包含非法字符嘗試注入!/n/nHTTP://WwW.WrSkY.CoM 系統版本:V2.0(ASP)完美版');<Script>
Response.Write "非法操作!系統做了如下記錄↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作時間:"&Now&"<br>
esponse.Write "操作頁面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:GET<br>"
Response.Write "提交參數:"&Fy_Get&"<br>"
Response.Write "提交數據:"&Request.QueryString(Fy_Get)
Response.End
End If
Next
Next
End If
'----------------------------------
這段代碼的作用是對攻擊者的信息及動作記錄,以便我們采取必要的應對措施。從代碼中可以看出程序分別對攻擊者的IP,提交地址,提交內容等進行了記錄,但這里明顯有幾處漏洞:
一、未對頻繁的攻擊進行處理。也就是說,無論我們怎么提交法數據,都會被程序記錄,這樣一來,將很可能導致惡意攻擊的dos攻擊。對此我做了一個試驗。我在某個被保護文件的url后提交下列語句:and (select top l asc(mid (username,l,l)) from admin)>0,在提交過程中用按鍵精靈來記錄,然后自動重復提交。不一會,數據庫大小就發生了顯著變化(如圖1、2)??梢韵胂螅绻盟费┑裙ぞ唛_多線程提交,dos是絕對不成問題的。
圖 1
圖 2
二、記錄數據長度未做截斷。這是我在對防注入程序影響論壇運行的測試中發現的。如圖3所示,如果發帖內容中包含被過濾字符時,帖子內容會被完全記錄到數據庫中。一般的論壇或文章系統對發表文章的長度都是限定的,但SQL通用防注入程序并未對此做出限制。如果攻擊者在被保護文件的url后提交一段超長的內容,很可能會導致程序的崩潰。因為危害較大,我沒有試驗,但我提交長達100K的內容卻是被照常記錄的。
圖 3
三、數據內容的轉換及爆庫問題。從代碼中看,程序對非法提交的數據是未經轉換就完全直接記錄到數據庫中的。也就是說,無論你提交什么只要包含被過濾的內容程序就會把你提交的所有內容進行記錄。這個問題本來是并無大礙的,但某些站長為了“安全”起見,喜歡把mdb文件一律改為asp后綴的。再加上防注入程序的數據庫中只有一個表,我們就可以通過在被保護文件url后直接寫入數據庫獲得webshell了,在測試過程中,我們把sqlin.mdb改為sqlin.asp,然后在被保護文件的url后輸入了一個冰浪子微型ASP后門。用冰狐客戶端進行連接后成功獲得wedshll。
因為這種獲取webshell的方法需要確定對方的數據庫是以ASP形式運行的,并且知道數據路徑,所以我們必須想辦法得到這個數據庫的路徑。一般情況下,我們可以直接猜數據庫路徑,但其實這個路徑是可以暴出來的,縱觀整個防注入程序,并沒有發現什么防爆庫的語句,所以我們只須直接訪問或用%5C大法就能爆出這個數據庫了.而如果是把程序代碼直接放到數據庫連接文件后的話,由于數據連接文件一般都包含防爆語句,我們就不能爆出數據庫的地址了。
上面說的都是數據記錄過程中的問題,有能力的站長可以自己動手修補相關漏洞,比如對大量重復提交法數據的IP自動屏蔽等。其實,我們完全可以去掉數據記錄部分代碼,這樣并不影響對變量的過濾,而且既使記錄了攻擊者的信息作用也不是很大的。所以我建議最好還是去掉這段代碼,這樣一來所有的漏洞就都不復存了。
好了,本文的分折就到此為止,最后提醒大家在使用安全防范程序時也要注意程序自身的安全問題
特別提示,防注入程序3.0也有漏洞,而且漏洞更為嚴重
新聞熱點
疑難解答