Webshell 檢測綜述
摘要:隨著互聯網的快速發展,Web應用已成為人們日常生活和工作中必不可少的一部分,隨之而來的是大量針對Web服務的攻擊,在目標服務器上植入Webshell已成為攻擊者最常用的手段。通過Webshell,攻擊者可以在目標服務器上執行一些命令從而完成信息嗅探、數據竊取或篡改等非法操作,對Web服務器造成巨大危害。最開始研究人員通過從Webshell中提取特征碼的方式來檢測Webshell,后來為了逃避檢測,混淆和加密技術在Webshell中被廣泛采用,這極大地增加了Webshell檢測的難度,為此許多研究人員開始采用機器學習技術來進行Webshell的檢測。從多個角度闡述了Webshell檢測技術發展現狀、所遇到的問題及今后的研究方向。
內容目錄:
1 Webshell 簡介
2 檢測方案
3 結 語
隨著Web技術的快速發展,Web功能的增強,越來越多的應用選擇通過Web為用戶提供服務。大量的Web應用在豐富和便利了人們的日常生活和工作的同時也暴露了大量的攻擊面,導致大量Web服務器時常遭受攻擊。攻擊者在攻陷Web服務器后通常會在Web服務器上植入Webshell,并利用它來控制Web服務器。據微軟公司的研究報告顯示,從2020年8月到2021年1月,平均每月在服務器上遇到此類威脅的
次數為140 000次,幾乎是上一年77 000次月均的兩倍。Webshell可以為攻擊者提供一種偽裝成與合法流量混合的通信信道,利用該信道可以實現對失陷網絡的持久訪問。Webshell惡意軟件是一種長期存在的普遍威脅,能夠繞過很多安全工具的檢測。
網絡攻擊者一般通過Web應用的自身漏洞或者與其相關的其他失陷主機進行Webshell的部署,Webshell可以作為一個持久性的后門,或者作為一個中繼節點將攻擊者的命令傳遞給其他系統。攻擊者經常將多個失陷系統上的Webshell串聯起來,從而實現跨網絡流量的傳遞。
最開始Webshell都是明文傳輸的,并且通信流量也都未采取任何保密措施,于是安全研究人員從Webshell或者其通信流量中提取明文特征碼,然后通過檢測特征碼實現對Webshell的檢測。隨即,為了繞過檢測工具,攻擊者采用了混淆和加密技術對Webshell進行混淆、加密,或者將Webshell代碼嵌入到正常文件中。這對Webshell的檢測造成了很大的困擾,如何準確地檢測出Webshell,阻止基于Web的攻擊已經成為網絡安全領域的研究熱點。許多研究人員在Webshell檢測領域進行了深入研究,并提出了一些卓有成效的方法。這些方法主要集中在文件檢測和流量檢測兩種不同的技術路線上。
本文將從攻擊原理和逃逸手段兩個方面對Webshell進行介紹,再從文件和通信流量兩個方向上介紹現有的Webshell的檢測方案,并提出未來可能的技術路線。
1 Webshell 簡介
Webshell是以ASP、ASPX、JSP、PHP等Web腳本形式存在的一種代碼執行環境。網絡管理人員利用它可以進行服務器、網站后臺的管理,而攻擊者利用它可以控制服務器執行一些特定的命令,以完成信息收集、數據竊取、系統破
壞等操作。攻擊者首先利用服務器的漏洞將具有特定功能的Webshell腳本上傳到服務器,然后通過訪問該Webshell腳本,在服務器上遠程執行命令。
1.1 攻擊原理
Webshell的種類有很多,由于不同腳本其自身的語言特性,所實現的Webshell代碼結構也有很大的差別。雖然Webshell在代碼表現形式上有很大的不同,但它們實現攻擊的本質是一樣的。本文以PHP Webshell為例。
為了豐富用戶體驗,現在的Web應用程序都具有交互特性,即同一個頁面可以根據用戶的需求呈現不同的內容。用戶在訪問服務器時可以在請求中攜帶參數,服務器收到請求后解析參數,根據不同參數的含義執行對應的操作,然后再將執行結果返回給用戶。一旦Webshell腳本被植入到服務器,攻擊者就可以利用Web應用程序的交互特性訪問Webshell腳本,Web容器收到請求后會解析請求中的參數,然后調用相應的解釋器執行Webshell腳本,并將解析好的參數傳遞給Webshell腳本。一個PHP Webshell代碼如圖1所示。

圖 1 一句話 PHP Webshell
圖1中$_REQUEST[‘password’]可以獲取用戶Web請求中的password參數值,這是由PHP語言支持的。如果用戶在請求中將password參數設置為一段PHP代碼,那么這段代碼將會通過eval函數被PHP解釋器執行。攻擊者可以通過這段代碼完成諸如系統命令執行、文件操作、數據庫操作等任務,以實現信息收集、數據竊取、主頁篡改等功能。
eval函數的作用是將參數字符串當作PHP代碼去執行,除此以外,在PHP中的system、exec、shell_exec、passthru、proc_open、show_source、parse_ini_file、popen等函數以及動態函數都具有命令或代碼執行功能,這是通過Webshell實現攻擊的一個重要原因。
可以看到,在整個攻擊過程中,參數傳遞屬于正常的超文本傳輸協議(Hyper Text Transfer Protocol,HTTP)交互,所執行的函數也是編程語言本身的功能,這就給Webshell的檢測帶來了很大的難度。隨著時代和技術的變遷,出現了以下4類常見的Webshell。
(1)通用型Webshell。通用型Webshell的功能比較全,對應的腳本文件也會比較大,它會調用許多系統關鍵函數,并且通常會對代碼進行加密以隱藏自己。
(2)單一型Webshell。單一型Webshell是功能比較單一的Webshell,一般只包含一個功能,常見的Webshell功能包含打包網站源碼、導出網站數據庫、上傳通用型Webshell等。
(3)一句話Webshell。顧名思義,一句話Webshell腳本中只包含一條代碼,一般這條代碼可以執行任意通過參數傳遞過來的代碼或命令,如圖1所示。一句話木馬適用場景廣泛,既可單獨以文件的形式存在于Web目錄中,也可嵌入其他文件中。因為只有一行代碼,所以暴露出來的特征也會比較少,通過適當變形可以很容易繞過查殺。
(4)內存Webshell。內存Webshell是在內存中寫入惡意代碼并執行,以達到遠程控制Web服務器的目的。內存Webshell利用了一些Web中間件的漏洞執行某些惡意代碼,過程中不會有文件落到磁盤中,檢測難度比較大。
1.2 逃逸手段
為了避免被查殺,攻擊者采用了多種方式對Webshell進行變形或者對通信流量進行加密,常用的方法包括以下6點。
(1)插入注釋。在代碼段中插入注釋信息,注釋信息不會影響程序的正常執行,但是對檢測工具會造成一定的干擾。
(2)字符串編碼/加密。對代碼中的一些關鍵字符串用Base64或其他編碼方式進行編碼,更有甚者利用約定好的加密方式進行加密,在調用的時候動態地進行解碼或者解密。
(3)外形混淆。對代碼中的變量名、函數名等標識符用一些無意義的符號進行等價變換,變得讓人難以分析、理解。
(4)邏輯混淆。通過插入分支、插入循環等方式變換程序的控制流程,讓程序變得難以被分析。
(5)字符串拆分。對于一些關鍵字符串,可以拆成很多段,用多個不同的參數進行傳遞,最后在使用的時候再進行拼接。
(6)通信流量加密。可以通過約定好的,或者協商出來的加密方法對通信流量進行加密。
2 檢測方案
根據上面的介紹,利用Webshell控制失陷主機主要經歷兩個階段:一個階段是Webshell文件上傳,另一個階段是命令執行。Webshell文件因為需要通過執行攻擊者發送過來的一些命令來控制Web服務器,所以它與普通Web頁面腳本之間存在較大的不同。另外,因為獲取的信息以及獲取信息的方式與正常Web頁面請求之間的巨大不同,攻擊者利用Webshell執行命令期間,與Web服務器間的通信流量和正常頁面請求的流量之間也存在較大不同。所以本文關于Webshell的檢測研究也主要從文件和通信流量兩個方面進行。
盡管有許多方法可以檢測Webshell,但檢測Webshell依然是比較困難的,因為攻擊者可以很容易地利用加密、編碼、混淆等方式對Webshell腳本文件和流量進行修改,導致檢測方法顧此失彼,所以最為有效的檢測方法是構建一個同時使用多種檢測方法的縱深防御體系。
在檢測Webshell過程中,無法避免將正常文件錯誤標記為Webshell的情況,當一個潛在的Webshell被檢測到之后需要結合其他手段,甚至通過人工的方式去確認Webshell的真實性。
2.1 基于文件的檢測
基于文件的檢測方法主要從文件操作、文件之間的關系和文件內容這3個方面對文件進行分析,進而發現潛在的Webshell文件。
2.1.1 基于文件操作的檢測方法
Webshell文件一般都是由攻擊者在攻陷了一個Web服務器后放置在服務器上的Web目錄中,它主要通過在Web目錄下新增一個文件,或者修改現有的文件來實現。可以用OSSEC、audit、dnotify等工具對Web目錄及其子目錄下的文件進行監控,一旦發現文件創建或者修改就進行告警,由安全專家進行分析,或者調用其他自動化分析工具對創建或者修改的文件進行分析,從而識別出攻擊者上傳的Webshell。
基于文件監控的方法可以及時、高效地檢測出可疑文件,但這些可疑文件究竟是不是Webshell還需依賴其他分析工具或者人工分析(因為一些正常業務也涉及新文件創建和修改),并且該方案需要在各個服務器上安裝相關的文件監控軟件,這在一些場景下是不被允許的,總體部署成本較高。
2.1.2 基于文件連接關系的檢測方法
一個Web站點通常包含非常多的頁面,記住每個頁面的地址并在地址欄中輸入地址進行訪問顯然是不現實的,為了方便用戶操作,一個頁面中往往包含很多指向站點內其他頁面的鏈接,用戶通過這些鏈接就可以訪問站點內的幾乎所有頁面。對于那些通過文件上傳植入到Web服務器上的Webshell來說,正常頁面中幾乎不會有指向Webshell腳本的鏈接,攻擊者都是通過直接訪問它的路徑去執行特定操作的,所以Webshell腳本通常是一個或幾個孤立的頁面。基于這一點可以將一個站點看作一個有向圖,站點中的每個頁面對應圖中的每個節點,不同頁面間的鏈接指向關系對應圖中的有向邊。在這個有向圖中,如果一個節點的入度很大,則表明有許多其他節點對應的頁面中包含有指向該節點對應頁面的鏈接,它為正常頁面的概率也就很大。相反,如果圖中一個節點的入度為0(或者很小)或者幾個節點組成的強連通子圖的入度為0(或者很小),則這些節點對應的頁面是異常的概率就很大。
基于上述設想可以基于主動掃描與被動訪問相結合的方式將一個站點的頁面關系圖創建出來,計算圖中節點的入度,如果入度為0或者入度相較于其他節點來說小很多,則節點對應的頁面有很大概率是異常的。該方案可以通過網頁之間的鏈接關系發現潛在的異常頁面,但無法確定這些異常頁面是否是Webshell,通常需要借助其他分析工具進行進一步的分析。另外如果站點內的頁面很多,創建出來的頁面關系圖會很大,圖的相關算法的效率也會大幅下降。
2.1.3 基于文件內容的檢測方法
基于正則表達式的特征碼方法是最早被廣泛用來進行Webshell檢測的一種方法。這種方法需要研究人員對已知的Webshell腳本進行研究,從中提取特征碼,做成一個特征庫。在檢測階段用待檢測文件的內容去匹配特征庫,如果匹配到一個特征庫,則認為待檢測文件是一個Webshell文件。這種方法的特點是操作簡單、檢測速度快,但是它也有明顯的缺點:為了保證檢測準確率需要頻繁更新特征庫,人力耗費比較大,無法檢測未知的Webshell,容易被經過混淆和加密的Webshell繞過。
為了解決基于傳統檢測方法所遇到的問題,機器學習技術被用來進行Webshell文件的檢測,實踐證明基于機器學習的方法在Webshell中起到了重要作用。其中,與Webshell相關的特征工程在基于機器學習的檢測中扮演了重要的角色。與之相關的特征選擇主要分為文本特征和語法特征兩種類型。
文本特征無須考慮腳本的編程語言特性,僅從字符、單詞、標點符號等分布情況去實現Webshell的檢測。Behrens等人設計實現了一種基于統計方法的檢測工具——NeoPI。該工具試圖從最長字符串、信息熵、重合因子3個方面判斷一個文件包含混淆代碼的可能性。因為正常的腳本文件里面的單詞通常都是比較短的,但是經過混淆、編碼之后往往會產生很長的單詞,識別出這些反常的長單詞有助于識別混淆代碼。信息熵可以用來度量一段信息的混亂程度,信息熵越大,則信息越混亂。Webshell腳本文件為了繞過常規的檢測會對它的一些內容進行加密,加密后的數據往往比較混亂,導致信息熵變大,因此利用信息熵可以識別混淆代碼。重合因子是一種在密碼分析和自然語言分析中常用的技術,NeoPI只能用來度量一個文本文件或腳本文件經過混淆或者加密的可能性,但是無法用來確定該文件就是Webshell文件,所以僅用它來檢測Webshell腳本的效果并不好,其發展重點在于作為一種輔助工具,結合其他檢測方法進行檢測。
胡必偉等人提出了一種基于貝葉斯理論的Webshell檢測模型,首先從文件中提取最長單詞長度、壓縮率、重合因子等特征進行分析,然后訓練一個貝葉斯分類進行Webshell的檢測。胡建康等人提出了一種基于決策樹的檢測模型,從文件中提取出單詞數量、文本行數、函數調用模式的數量等特征作為特征向量去訓練決策樹模型,并用訓練好的模型進行檢測。該模型雖然在實驗數據集上取得了不錯的效果,但在實際應用中效果不佳,主要是因為提取的單詞數量、文本行數、函數調用模式的數量等特征對于Webshell腳本和正常文件的區分度不大。LYU等人提出了一種利用卷積神經網絡檢測Webshell的方案,該方案首先利用除英文和阿拉伯數字外的字符作為分隔符對文件進行分詞,然后選擇Word2vec算法對詞進行向量化編碼,最后用卷積神經網絡訓練一個二分類模型。該方案不需要人工提取特征,設想利用深度神經網絡強大的學習能力直接從文本文件學習出Webshell腳本文件和其他文件之間的差異。雖然深度學習具有直接從原始數據中提取特征并進行學習的能力,但是這嚴重依賴于樣本的質量和數量,如果有足夠多的高質量樣本,訓練出的模型是可以學習到Webshell腳本和其他文件之間的真正的差異的。在現實中,能獲取到的Webshell樣本數量是比較少的,并且質量也無法保障,因此訓練出來的模型往往是過擬合的,在訓練集上表現很好,但在實際應用中表現較差。
Webshell腳本都是符合某種編程語言語法的腳本,將其當作普通文本進行分析會丟失許多有價值的信息。利用語言語法層面的特征進行分析可以更容易地區分Webshell腳本和普通腳本文件。
孟正等人提出了一種從頁面屬性和頁面操作角度基于支持向量機(Support Vector Machine,SVM)分類進行Webshell檢測的模型,通過對常見Webshell腳本代碼進行分析,從腳本文件中提取出頁面長度、代碼行數、注釋個數、加解密函數調用、system/eval/exec/shell_exec函數調用、系統函數調用、字符操作類函數調用、系統函數調用、文件操作類命令、ftp操作類命令、數據庫操作類命令等作為特征向量,然后用SVM算法進行分類。該方案從Webshell執行原理上進行了分析,提取出Webshell腳本執行過程中常用且正常的Web腳本中不常用的一些函數作為特征,可以有效減少數據噪聲的干擾,同時也降低了對樣本數據量的要求。但是一些經過混淆的腳本幾乎無法從中看到上述函數或者命令的身影。為了解決這個問題,Pan等人[9]提出了從PHP代碼中提取Opcode序列作為一種重要特征,同時結合信息熵、最長單詞長度、數據壓縮比、關鍵函數或黑名單函數的調用情況等靜態統計特征構造一個特征矩陣,然后用SVM、卷積神經網絡(Convolutional Neural Networks,CNN)等分類模型進行訓練,訓練好的模型被用來檢測Webshell。Opcode是PHP代碼執行過程中的一種中間碼,PHP源碼經過詞法分析、語法分析后,再通過PHP的Zen引擎處理后會生成Opcode序列,在生成Opcode序列的過程中其實已經去除了絕大部分的混淆,所以這種方法能有效檢測經過混淆的Webshell腳本。但是Opcode目前僅在PHP中相對比較容易獲取,其他類型的腳本暫時還無法輕易獲取類似PHP Opcode的中間碼。
2.2 基于通信流量的檢測
由于所要完成的功能不同,攻擊者訪問Webshell腳本所產生的流量和正常Web頁面請求所產生的流量模式是不同的,基于通信流量的檢測就是通過對流量進行分析發現不同尋常的流量。基于流量的檢測是基于文件檢測的一個重要補充,在某些場景下獲取文件并對其進行檢測是困難的,并且還有一些Webshell是基于內存的,無法通過文件的方式進行檢測,這時基于流量的檢測就成為最重要的檢測方式。
2.2.1 流量內容
Tian等人提出了一種利用卷積神經網絡對流量內容進行分析的Webshell檢測模型,該方案首先對http請求內容進行分詞,并用word2vec算法進行向量化表示,然后基于“長截短補”的原則將http請求表示成為固定大小的矩陣,最后訓練出一個卷積神經網絡模型進行Webshell檢測。雖然該模型在實驗中取得了不錯的效果,但是因訓練樣本不足導致的過擬合問題依舊存在,并且該模型無法處理經過加密的流量。為了繞過安全檢測設備的檢測,越來越多的Webshell拋棄了明文傳輸數據的方式,轉而采用加密流量進行通信。
Zhang等人提出了一種在字符級利用卷積神經網絡和長短時記憶網絡檢測Webshell的模型,該方案分別從請求的統一資源定位系統(uniform resource locator,URL)和請求體中提取固定長度的字符,并將這些字符的ASCII碼值作為特征向量輸入到一個卷積神經網絡,再將卷積神經網絡的隱藏層輸出作為長短時記憶網絡的輸入進行分類。該方案將流量看作字節流進行處理,用大量的明文Webshell流量進行學習是可以學習到一些Webshell流量特征的。并且理論上該方法也適用于加密Webshell流量,但是需要利用大量采用各種加密算法加密的Webshell流量進行訓練。
2.2.2 流量行為
許多Webshell為了繞過基于流量內容的檢測工具對其通信流量進行了加密,有些在加密前會有一個握手協商階段,有些則省略了協商階段直接從第一個報文開始進行加密。有握手協商階段的Webshell可以利用協商階段的特征進行檢測,但僅僅利用這些特征是不夠的,仍會產生較高的誤報率,沒有握手協商階段的Webshell因為沒有什么明文的特征可以用來進行檢測,所以產生的誤報率會更高。雖然流量內容是被加密的,但是流量的交互行為是無法加密的,可以通過對流量的交互行為進行分析,從而實現對Webshell通信流量的檢測。
Stergiopoulos等人提出了一種利用傳輸層行為特征檢測加密流量的方案,該方案提取每個方向上每個報文負載大小、請求報文應答報文負載比、請求報文之間時間間隔、請求響應報文之間時間間隔等作為特征向量,然后訓練一個分類器去識別攻擊流量。Yu等人在傳輸層相關行為特征的基礎上增加了加密協議握手階段的明文特征,并以指定的滑動窗口為單位計算均值、方差等統計量來擴展特征,然后用堆疊自編碼器檢測加密的攻擊流量。雖然采用這些基于流量行為的檢測方法在一定程度上能夠在加密流量中檢測出攻擊流量,但可利用的特征偏少,總體誤報率偏高。
3 結語
本文主要從文件和流量兩個角度對近幾年安全領域針對Webshell檢測的研究成果進行系統的總結,分析了不同類型檢測技術所具有的優勢及其局限性。鑒于混淆、加密等技術在Webshell中的廣泛應用,通過單一手段檢測Webshell變得越來越困難。更有效的解決方法是建立一種多層次檢測系統,綜合運用文件側和流量側多種檢測技術在攻擊的不同階段對Webshell進行檢測。目前的檢測手段雖然能夠應對一些常規的Webshell攻擊,但是對于一些精心構造的Webshell攻擊越來越顯乏力,因為攻擊者為繞過檢測會刻意隱藏許多信息,這導致從單一角度獲取到的有效信息會很少。要解決這個問題,未來需要重點研究如何將流量側、文件側、系統日志側等各種來源的數據有機地整合在一起,用一種有效的表征方式進行表示,然后利用機器學習算法進行分析,以進一步提高檢測效果、降低誤報率。