現在基於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("REMOTE_ADDR")&"','"&Reable. GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.close
Set Fy_db = Nothing
'--------寫入資料庫-------尾--------
Response.Write "<Script Language=JavaScript>alert('楓網SQL通用防注入系統提示↓ nn請不要在參數中包含非法字元嘗試注入!
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也有漏洞,而且漏洞更為嚴重