程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> MSSQL通用防注入程序的漏洞

MSSQL通用防注入程序的漏洞

編輯:關於SqlServer

      現在基於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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved