Webshell檢測方法
一、Webshell概述
Webshell是基于Web的一種應用程序,可以將其視為可在服務器上執行的一種遠程訪問工具或后門木馬文件。Webshell作為一種web后門,通常由攻擊者通過常見的Web網站漏洞,如sql注入、文件包含和上傳等,上傳到服務器,從而為攻擊者提供與服務器端進行交互的能力。

根據Webshell的代碼長度不同,通常可以將其分為大馬、小馬和一句話木馬。小馬通常只有幾行甚至一行代碼,實現的功能較為單一,如文件傳輸和權限提升等,攻擊者通常將其用作跳板,繞過上傳文件大小限制來上傳功能更多的大馬,大馬是具有完整入侵功能的Webshell,它們的體積要大得多,具有用于文件操作,命令執行和數據庫連接的友好圖形用戶界面,它們通常會調用系統功能,以便利用混淆技術來隱藏功能用于逃避檢測。一句話木馬一種特殊的小馬,通常只有一行代碼,但其使用場景豐富,可插入其他文件中,隱匿性強,可變形免殺。
Webshell的特點主要有:
- 存在系統調用的命令執行函數,如eval,system,cmd_shell,assert等;
- 存在系統調用的文件操作函數,如fopen、fwrite、readdir等;
- 存在數據庫操作函數,調用系統自身的存儲過程來連接數據庫操作;
- 具備很深的自身隱藏性、可偽裝性,可長期潛伏到web源碼中;
- 衍生變種多,可通過自定義加解密函數、利用xor、字符串反轉、壓縮、拼接等方法來繞過檢測;
- 訪問ip少、訪問次數少、頁面孤立、傳統防火墻無法進行攔截,無系統操作日志記錄;
- 連接webshell的payload流量會記錄在web日志中。
二、Webshell檢測方法
1、靜態特征匹配
靜態特征匹配的檢測方法通過提取大量已知的Webshell的文件特征,如關鍵字、高危函數的調用等,通過構建規則庫,利用規則匹配或相似性計算方法等實現Webshell的檢測,常見的web查殺安全工具D盾使用的就是這種檢測方法。此外,還會將已知的Webshell的MD5值保存在特征庫中,在檢測時對待檢測文件進行MD5值的計算,并與特征庫進行比較查看是否匹配。
但這種方法常常無法檢測到經過加密、編碼、拼接等混淆手段的Webshell變形。如下圖的代碼是經過base64編碼混淆后的 Webshell變形,使用靜態的檢測方法難以對其進行檢測。

2、基于統計特征的檢測
由于Webshell往往經過了編碼和加密,與常規的文件相比,會有一些特別的統計特征,可以根據這些特征統計進行檢測。這類檢測方法的典型代表: NeoPI ( https://github.com/Neohapsis/NeoPI )
NeoPi使用以下五種特征進行檢測:
- 信息熵(Entropy):通過使用ASCII碼表來衡量文件的不確定性,通常經過混淆的Webshell文件信息熵更大;
- 最長單詞(LongestWord):最長的字符串也許潛在的被編碼或被混淆;
- 重合指數(Indexof Coincidence):低重合指數預示文件代碼潛在的被加密或被混淆過;
- 特征(Signature):在文件中搜索已知的惡意代碼字符串片段;
- 壓縮(Compression):對比文件的壓縮比,Webshell文件壓縮比通常比正常文件低;
NeoPi的檢測重心在于識別混淆代碼,適用于檢測經過混淆的Webshell。
3、基于日志的檢測
基于日志的檢測方法是在攻擊發生之后,通過分析大量日志信息,對攻擊進行溯源,是在web服務器被入侵之后進行排查的手段。由于攻擊者成功上傳Webshell后,會通過80端口訪問Webshell文件來完成各類惡意操作,因此攻擊者對Webshell的訪問會被記錄在web日志中,通過整合在系統各處的日志,可以對其進行分析,區分正常web網頁和Webshell在日志文件中的不同特征,檢測是否存在Webshell。
由于Webshell有以下訪問特性:1)少量ip對其發起訪問;2)總的訪問次數少;3)通常Webshell屬于孤立頁面,可將其用于日志分析中。但由于日志的多樣性和復雜性,該方法有可能會產生大量的誤報,并且由于日志數量的龐大,大量讀寫日志很可能會對服務器的性能造成影響。
4、基于流量的檢測
基于流量特征的檢測是動態檢測的一種方法,該方法主要是對網絡流量進行抓包與分析,通過區分惡意流量和正常流量,從而檢測是否存在Webshell。目前國內外的很多入侵檢測和入侵防御系統都采用了這種方法。
基于流量的特征檢測雖然能夠較好地識別惡意流量,但由于流量信息的龐大,實時監測的難度較大,對系統的吞吐量要求高,很容易產生流量數據包丟失等問題而對檢測結果產生一定的影響。
5、基于行為特征的檢測
基于行為的分析檢測也是目前常用一種的動態檢測Webshell的手段,在入侵檢測中應用廣泛,該方法通過對惡意代碼的行為進行捕捉與分析,檢測異常行為,從而進行惡意代碼的識別。
RASP產品就使用了這一檢測方法,通過插樁等技術在應用程序運行過程中對執行危險操作的函數進行hook,檢查其執行的參數,從而檢測并阻止惡意代碼運行。
php類型的Webshell檢測一般通過php擴展對opcode進行hook,jsp類型的Webshell檢測一般通過java agent的方式實現字節碼的動態修改,從而對惡意行為進行檢測。
三、內存馬查殺
1、內存馬的分類

2、php內存馬

將該段代碼上傳至php服務器并訪問,會在同一目錄下循環生成shell.php的一句話木馬文件。其查殺方式有:
1)在條件允許情況下,重啟服務器;
2)kill掉www-data用戶所有子進程:ps aux | grep www-data | awk '{print $2}' | xargs kill -9
3、python flask內存馬
Python內存馬可利用flask框架中ssti注入來實現,flask框架中在web應用模板渲染的過程中用到render_template_string()進行渲染但未對用戶傳入的參數進行過濾,就可以通過注入惡意代碼來實現python內存馬的注入。以下payload利用ssti注入注冊了一個/shell的路由,路由對應的邏輯為執行cmd參數值命令。


查殺方式:找到惡意路由并刪除或重啟服務器。
4、java內存馬
在java web中,客戶端發起的web請求會依次經過Listener、Filter、Servlet三個組件,只要在這個請求的過程中做手腳,在內存中修改已有的組件或者動態注冊一個新的組件,插入惡意的shellcode,就可以注入內存馬。
根據內存馬注入的方式,大致可以將內存馬劃分為以下兩類:
1)servlet-api型:通過命令執行等方式動態注冊一個新的listener、filter或者servlet,從而實現命令執行等功能。特定框架、容器的內存馬原理與此類似,如spring的controller內存馬,tomcat的valve內存馬
2)agent型:通過java的instrumentation動態修改已有代碼,進而實現命令執行等功能。
本文主要以Servlet內存馬為例來介紹其原理和查殺方式。
- Servlet內存馬
Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。它負責處理用戶的請求,并根據請求生成相應的返回信息提供給用戶。
在注入內存馬的過程當中,可能需要用到反射機制,例如注入一個servlet型的內存馬,需要使用反射機制來獲取當前的context,然后將惡意的servlet添加到當前的context的children中。
servlet內存馬注入過程如下:首先創建一個惡意的servlet,然后獲取當前的StandardContext;再將惡意servlet封裝成wrapper添加到StandardContext的children當中,最后添加ServletMapping將訪問的URL和wrapper進行綁定。
執行上述操作后,訪問指定的URL路徑就可以進行命令執行了。

以哥斯拉的servlet內存馬為例,在getshell后生成servlet內存馬并綁定指定的url進行注入,接著就可以直接使用綁定的url進行內存馬的連接。
- Java內存馬檢測工具
(1)java-memshell-scanner
通過jsp掃描應用中所有的filter和servlet,然后通過名稱、對應的class是否存在來判斷是否是內存馬

通常內存馬的惡意servlet和filter等式動態注冊的,在ClassLoader目錄下沒有對應的class文件
(2)cop.jar工具
可以識別異常的類,在結果中會顯示所有運行的類以及危險等級,比較高的可以進入目錄查看代碼進行分析,在java目錄下或class文件夾下會保存木馬以及運行的類,可以用D盾等webshell查殺工具進行掃描。
(3)arthas-boot.jar工具
是阿里開源的Java診斷工具,可以實時監控jvm狀態。mbean命令可查看可疑的servlet和filter節點,sc命令可以查看JVM已加載的類信息,若有可疑的類,可通過jad命令反編譯得到源碼進行排查。
四、總結
總的來說,無論是常見的Webshell,還是經過加密、編碼、拼接等混淆的Webshell變形、內存馬等,都需要利用Web應用的各種漏洞進行上傳,如命令執行、反序列化RCE、文件上傳等等,Webshell一旦被上傳,無論通過流量、文件特征進行檢測并查殺,都只是應急手段,無法從根源上防止攻擊。
因此,最好的防護方法就是加強邊界防護,減少暴露在外的應用漏洞。但是目前0day漏洞頻出,邊界突破手段防不勝防,因此,許多安全廠商和互聯網大廠都在研究RASP技術,該技術通過注入應用程序內部實現安全防護,對比其他檢測方法來說,它可以在程序通過Webshell執行惡意命令前對其進行檢測和阻斷,但該技術的應用目前仍在起步階段,未來隨著RASP技術的發展,針對Webshell的檢測與防護可能會有新的突破。