SQL注入程式帶來的攻擊及防範

來源:互聯網
上載者:User
程式|攻擊     現在基於web的攻擊一般都是注入。導致注入的原因一般為對變數的過濾不完全,從而可以使入侵者非法執行程式或查詢修改任意資料。隨著注入攻擊的愈演愈烈,一些專門的過濾代碼應運而生。但一些過濾代碼的不完善很可能導致新的攻擊。下面就以目前應用最廣泛的過濾代碼--SQL通用防注入程式為下列說明漏洞的成因、利用方法及防範措施。

  SQL通用防注入程式是由Firefox的楓知秋編寫的,功能相當完善的防注入代碼。它能對定義的過濾字元實現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] 下一頁  



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。