孔德廣,蔣朝惠,郭 春,周 燕
Webshell是一種黑客對服務器進行控制的后門程序[1]。如果黑客發現Web應用存在文件上傳漏洞,46%的黑客都會上傳Webshell進行后續的攻擊[2]。根據《2016年中國互聯網網絡安全報告》[3]的統計,CNCERT/CC共監測到境內82 072個網站被植入了后門(Webshell)。黑客可以暗中對Web服務器進行遠程控制,上傳、查看、修改、刪除網站服務器上的文件,讀取并修改網站數據庫的數據,甚至可以直接在網站服務器上運行系統命令。文件上傳漏洞普遍存在于網站中,各大SRC也相繼爆出過嚴重的文件上傳漏洞[4-5]。文件上傳漏洞雖然數量上不如SQL注入漏洞,但一旦爆發,危害要比SQL注入漏洞大很多,可以直接上傳Webshell,從而拿下Web服務器。
目前,檢測Webshell主要還停留在事前和事后。事前防御有可能被繞過,事后防御屬于亡羊補牢,只有做到事中,才能確保Web服務器的安全。什么造成了文件上傳漏洞?主要是因為程序員在編寫網站的過程中,缺乏安全開發經驗[6-9]。目前,主要防御文件上傳漏洞的方法是客戶端校驗、服務端校驗和WAF校驗。
(1)客戶端校驗
不少程序員為了省事,直接在前端編寫限制文件上傳的過濾規則,通常有白名單也有黑名單形式。但是,這種做法會導致攻擊者通過直接捕獲數據包進行改包而繞過客戶端校驗。
(2)服務端校驗
服務端校驗是確保網站安全最基本的一個要求,主要方法有文件頭Content-type字段校驗、文件內容頭校驗、后綴名黑名單校驗、后綴名白名單校驗和自定義正則校驗等手段。但是,如果程序員在編寫服務端代碼時考慮不周全,以上幾種防御手段都可以繞過。同時,黑客可以結合文件包含漏洞、服務器解析漏洞、操作系統文件命名規則、Cms或者編輯器漏洞等繞過服務端校驗,從而上傳木馬得到Webshell。
(3)WAF校驗
目前,主流的防御方法是服務端校驗配合WAF校驗。但是,有些主機WAF為了不影響服務器的性能,會對校驗的用戶上傳數據設置大小上限。這種情況可以使用垃圾數據進行填充,當超過設置的校驗數據大小上限時,再填充木馬,從而達到繞過WAF上傳木馬的目的。不同的WAF都存在或多或少的繞過方式,大部分原因在于WAF設置的檢測策略存在缺陷。
此外,黑客還可以通過其他方式上傳Webshell,如網站權限過大,SQL注入能將Webshell寫入Web服務器;部分命令執行漏洞可以寫入Webshell,這給防御帶來了很多麻煩。因此,提出一種阻止黑客將Webshell寫入Web服務器的方法迫在眉睫。
為了抵御Webshell對網站的持續性危害,研究人員對Webshell的檢測進行了大量研究。目前,主要的檢測手段包括靜態分析和動態分析兩種。Truong Dinh Tu等人[10]采用靜態分析的手段,檢測文件中是否包含系統命令執行函數、惡意文件操作函數,并統計關鍵字出現的頻率,設置閾值來判斷被檢文件是否為Webshell,但該方法不能檢測代碼混淆的Webshell。石劉洋等人[11]采用動態分析手段,從Web服務器日志中提取相關特征,如URL特征、網站交互頻率、文本特征匹配以及頁面關聯性分析等識別Webshell,但日志過多,導致該檢測方法效率很低。此外,由于WebShell是通過80端口與遠程主機進行數據交換的,隱蔽性強導致檢測效果不高。2006年,Jesse Kornblum[12]提出了模糊哈希算法,主要用于文件相似性比較,后被用于取證和惡意代碼檢測。而Jason Sherman將該算法應用于SSdeep[13],同時最新版的ModSecurity也增加了SSdeep檢測Webshell的接口[14]。
目前,市面上檢測工具非常多,NeoPI[15]就是一款國外流行的基于統計特征的Webshell檢測工具。但是,該工具并沒有提供一個閾值來確定哪些文件是Webshell,需要依靠專家知識來判斷。而著名的Webshell檢測工具D盾,主要使用規則是對文件靜態特征進行匹配,但檢測效果依賴于規則的有效性,很容易被繞過。目前,大部分檢測工具基本都是事后查殺Webshell,即Webshell已經存留于服務器很長時間后才被查殺。這種檢測方案缺陷很大,黑客有可能早已獲得了相關隱私文件,達到了滲透的目的。因此,本文提出了一種基于Simhash的Webshell檢測方法。該方法檢測效率高,可以實現事中檢測,即黑客上傳成功Webshell后,在黑客還沒采取后續行動前就能檢測出Webshell并將其清除。
Simhash是一種局部敏感散列算法,在2002年被Charika等人[16]提出,后來谷歌Manku等人[17]將該算法用于海量網頁去重。該算法可將文本降維,生成一串位數較小的指紋。目前,Simhash算法在多種研究中得到應用,但在Webshell檢測上還沒有相關應用。
本文將每一個Webshell當成一個文本,經過分詞、散列、加權、合并、降維,最終生成64 bit的Simhash值。因為Webshell與網頁和文本具有不同特性,所以對Simhash的傳統算法做如下2點改動。
分詞。因為Webshell的特殊性,需要調用一些命令執行類函數、文件系統函數、數據庫操作函數,回調函數、反射函數等特殊關鍵字,所以本文將Webshell按照換行符和特殊關鍵字進行分詞。
權值。在文本分類中,一般依據分詞的頻率、屬性計算權值。在Webshell的Simhash計算中,將各分詞設置一個基礎權值。由于Webshell中存在一些特殊關鍵字,如pwd、password、username、system、fopen等,可對這類字符進行加權,將其權值設為其他分詞權值的2倍。
具體過程如下:
輸入:Webshell文件
輸出:每個Webshell的Simhash值
(1)創建一個64 bit向量,將其初始化為0。
(2)將Webshell文件進行分詞處理,一般按照換行符進行分詞,特殊情況下將特殊關鍵字單獨分詞。
(3)對特殊關鍵字進行加權,如system、popen、fopen、opendir、pathinfo、mysql_query、array_filter、array_reduce等特殊字符,將其權值設為其他分詞權值的2倍。
(4)對每個Webshell分詞進行散列,取其中64 bit散列值。
(5)加權合并。
(6)降維。
目前,黑客使用的Webshell基本是前人寫好的,也不排除有黑客使用新型的未知Webshell,但這些未知Webshell其中的大部分功能函數也是以前寫好的函數。如圖1所示,在網站內測過程中,收集市面上功能結構不重復的Webshell,通過Simhash算法生成Simhash初始指紋庫。當網站運行期間,如果發現新增可疑文件是Webshell且Simhash指紋庫中沒有收錄此指紋,即海明距離不等于零且最小值小于閾值時,就將其Simhash指紋更新至初始Simhash指紋庫。

圖1 Simhash指紋庫構建
如圖2所示,對Web應用站點所有具有寫權限的文件夾進行監控。當文件夾有新增文件即可疑文件時,計算可疑文件的Simhash值,然后與Simhash指紋庫進行海明距離比較。如果海明距離等于0,則該可疑文件就是Webshell,直接刪除該文件,并發郵件提醒網站管理員此網站正在遭受黑客攻擊。如果海明距離的最小值小于閾值,則該可疑文件是變種Webshell,即黑客對Webshell代碼進行了混淆。此時,將該變種Webshell的Simhash指紋添加到Simhash指紋庫,刪除該文件并通知網站管理員。如果海明距離大于閾值,則該文件為用戶上傳的正常文件。

圖2 Simhash指紋庫構建
為了選取合適的閾值,本實驗搜集了200個功能結構不重復的Webshell,然后使用Simhash算法計算生成200個Webshell指紋,以構建Simhash指紋庫。
黑客在使用Webshell前,最可能做的是只更改Webshell的登錄口令。少部分黑客會刪除作者信息、敏感特征,以繞過安全檢測。極少數黑客會進行代碼復用,重新編寫Webshell并進行代碼混淆。本文根據黑客心理,分別對200個Webshell進行編輯:修改登錄口令,刪除作者信息和注釋,刪除或者添加功能函數,增加無用代碼進行混淆處理。計算它的Simhash指紋,并與未修改前的Webshell指紋比較海明距離。如表1所示,200個Webshell修改登錄口令、作者信息、注釋前后,海明距離不是0就是1;添加或刪除功能函數、代碼混淆前后,海明距離也在1~3波動。所以,本次實驗將閾值設定為4,即如果海明距離小于4,則該可疑文件是Webshell。

表1 閾值變化情況
為了測試本文提出的檢測方法的有效性,另外收集100個Webshell和1 000個正常文件混合作為實驗樣本。然后,分別使用本文檢測方法、SSdeep、D盾進行檢測。如表2所示,基于Simhash算法的檢測方法一共檢測出94個Webshell,有6個未檢測出來,主要是因為Simhash指紋庫指紋量較少所致。SSdeep只檢測出84個Webshell,主要因為SSdeep閾值變化較大,在確保沒有誤報的情況下,漏報就會增多。D盾漏報較少,但誤報較高,這與其檢測規則有很大關系。通過對比可以發現,本文檢測方法在低誤報的情況下,能較好地檢測出Webshell。同時,在檢測時間方面,SSdeep所使用的比較算法會影響其檢測速度;D盾檢測規則大量運用正則匹配,嚴重影響檢測速度;而本文提出的方法檢測時間較短。究其原因,主要在于Simhash算法生成指紋效率高,計算海明距離速度快。

表2 市面上其他檢測工具和本文檢測方法效果對比
Webshell后門一直是我國面臨的巨大威脅,本文提出一種基于Simhash算法的Webshell檢測方法。該檢測方法和傳統的檢測方法相比,誤報大大降低。同時,由于Simhash算法的高效性,可以做到Webshell的實時檢測,給應急響應留下了充足時間。但是,該檢測方法的有效性需依靠完備的Simhash指紋庫,僅依靠樣本數據和少量更新的數據,不能滿足新的安全需求,還要不斷進行研究。
[1] Stranieri A,Zeleznikow J.WebShell:The Development of Web Based Expert Systems[J].Research and Development in Intelligent Systems XVIII,2002:245-258.
[2] Canali D,Balzarotti D.Behind the Scenes of Online Attacks:An Analysis of Exploitation Behaviors on the Web[C].20th Annual Network & Distributed System Security Symposium(NDSS 2013),2013.
[3] National Internet Emergency Center.China Internet Security Report in 2016[EB/OL].(2017-06-23)[2017-12-18].http://www.cert.org.cn/publish/main/upload/File/2016_cncert_report.pdf.
[4] CNVD.PHPEMS File Upload Vulnerability[EB/OL].(2017-11-20)[2017-12-18].http://www.cnvd.org.cn/flaw/show/CNVD-2017-35716.
[5] CNVD.Berta CMS Any File Upload Vulnerability[EB/OL].(2017-11-20)[2017-12-18].http://www.cnvd.org.cn/flaw/show/CNVD-2017-34604.
[6] Kieyzun A,Guo P J,Jayaraman K,et al.Automatic Creation of SQL Injection and Cross-site Scripting Attacks[C].Software Engineering,ICSE,2009:199-209.
[7] Martin M,Lam M S.Automatic Generation of XSS and SQL Injection Attacks with Goal-directed Model Checking[C].Proceedings of the 17th Conference on Security Symposium USENIX Association,2008:31-43.
[8] Balzarotti D,Cova M,Felmetsger V,et al.Saner:Composing Static and Dynamic Analysis to Validate Sanitization in Web Applications[C].Security and Privacy,2008:387-401.
[9] Appelt D,Nguyen C D,Briand L C,et al.Automated Testing for SQL Injection Vulnerabilities:an Input Mutation Approach[C].Proceedings of the 2014 International Symposium on Software Testing and Analysis,2014:259-269.
[10] Tu T D,Cheng G,Guo X,et al.Webshell Detection Techniques in Web Applications[C].International Conference on Computing,Communication and Networking Technologies IEEE,2014:1-7.
[11] 石劉洋,方勇.基于Web日志的Webshell檢測方法研究[J].信息安全研究,2016(01):66-73.SHI Liu-yang,FANG Yong.Webshell Detection Method Research Based on Web Log[J].Research on Information Security,2016(01):66-73.
[12] Kornblum J.Identifying Almost Identical Files Using Context Triggered Piecewise Hashing[J].Digital Investigation,2006,3(03):91-97.
[13] Jason S.Ssdeep Project[EB/OL].(2017-11-07)[2017-12-18].http://ssdeep.sourceforge.net.
[14] Ivan R.Modsecurity-handbook[EB/OL].(2017-07-15)[2017-12-18].https://www.feistyduck.com/books/modsecurity-handbook.
[15] Scott B,Ben H.NeoPI:Detection of Web Shells Using Statistical Methods[EB/OL].(2016-08-15)[2017-12-18].https://github.com/Neohapsis/NeoPI.
[16] Charikar M S.Similarity Estimation Techniques from Rounding Algorithms[C].Proceedings of the Thiryfourth Annual ACM Symposium on Theory of Computing ACM,2002:380-388.
[17] Manku G S,Jain A,Das Sarma A.Detecting Nearduplicates for Web Crawling[C].Proceedin gs of the 16th International Conference on World Wide Web ACM,2007:141-150.