鞏思越,張英韜,王寶會(huì)
(1.北京航空航天大學(xué)軟件學(xué)院,北京 100000;2.武漢大學(xué),湖北 武漢 430000)
隨著我國互聯(lián)網(wǎng)應(yīng)用的突飛猛進(jìn),Web應(yīng)用在眾多場景和業(yè)務(wù)中變得越來越重要,這也給不法分子提供了數(shù)不勝數(shù)的Web漏洞靶場。作為一種常用的攻擊工具,Webshell是以asp、php、JSP等常見的網(wǎng)頁文件形式存在的一種代碼執(zhí)行環(huán)境,也被叫做網(wǎng)頁后門。攻擊者通過層出不窮的Web漏洞進(jìn)入到后臺(tái)管理系統(tǒng)后,通常會(huì)將php或者JSP后門文件與網(wǎng)站服務(wù)器Web目錄下正常的網(wǎng)頁文件混在一起,然后就可以使用瀏覽器來訪問Webshell,從而進(jìn)行文件上傳下載或者進(jìn)一步的權(quán)限提升。根據(jù)2020年我國互聯(lián)網(wǎng)網(wǎng)絡(luò)安全態(tài)勢綜述[2]報(bào)告顯示,監(jiān)測發(fā)現(xiàn)境內(nèi)外約2.6萬個(gè)IP地址對(duì)我國境內(nèi)約5.3萬個(gè)網(wǎng)站植入后門,根據(jù)INTERNET LIVE STATS[3]統(tǒng)計(jì)數(shù)據(jù)顯示,2021年6月,平均每天會(huì)有19萬個(gè)網(wǎng)站受到不同程度的網(wǎng)絡(luò)攻擊,在所有的網(wǎng)絡(luò)攻擊中,后門植入(也稱Webshell攻擊、木馬攻擊)無疑是影響最大,最深遠(yuǎn)的。Webshell植入可以讓攻擊者長時(shí)間的控制服務(wù)器且不被發(fā)覺,可以不斷地從服務(wù)器中獲取數(shù)據(jù)并且對(duì)其進(jìn)行操控,這對(duì)于網(wǎng)站擁有者和網(wǎng)站用戶來講都是不可接受的。目前容易受到Webshell攻擊的對(duì)象都是一些較為老舊的、使用PHP及JSP編寫的網(wǎng)站,而現(xiàn)階段各家云服務(wù)廠商、安全廠商對(duì)于這些攻擊的檢測效果差強(qiáng)人意,一旦被攻擊損失慘重,并且絕大多數(shù)研究針對(duì)的都是PHP類型的Webshell攻擊進(jìn)行研究,針對(duì)JSP類型的Webshell檢測研究遠(yuǎn)遠(yuǎn)低于針對(duì)PHP類型的Webshell研究[8]。故本文希望能夠提出一種深度學(xué)習(xí)算法,針對(duì)JSP類型的 Webshell文本進(jìn)行檢測,提升整體的檢出精度,從而能夠更好的應(yīng)用在各個(gè)JSP web項(xiàng)目中,有效的保護(hù)JSP類型的Web項(xiàng)目,降低項(xiàng)目受到攻擊的概率,提高系統(tǒng)的安全程度。
JSP類型的Webshell檢測,主要分為三類,分別是基于流量檢測、基于日志檢測和基于文本檢測。本文主要研究對(duì)JSP類型的Webshell基于文本分類的檢測。基于文本分類的檢測實(shí)際上是對(duì)一份代碼文件進(jìn)行判斷,屬于文本二分類問題,優(yōu)勢在于發(fā)現(xiàn)及時(shí)、特征分析方便。目前比較主流的方式有三種:(1)基于特征匹配的方式進(jìn)行檢測,Ben Hagen于2011年設(shè)計(jì)實(shí)現(xiàn)了Neo PI[10]檢測器,用于對(duì)文件惡意性進(jìn)行定量檢測。該工具對(duì)文本的最長字符長度、信息熵、重合指數(shù)、已知惡意代碼字符串以及文件壓縮比等元素分析待測文件,但是該工具只對(duì)文件做定量結(jié)論,而不做定性評(píng)價(jià)。Luczko又設(shè)計(jì)了一款PHP shell detector[11],該工具是利用文件的MD5值來識(shí)別惡意文件,但是,MD5值的HASH特性,會(huì)導(dǎo)致漏報(bào)率比較高?;谖谋咎卣鞯臋z測,檢測效果優(yōu)劣主要依賴于特征庫的質(zhì)量,不同類型的Webshell各有特點(diǎn),需要根據(jù)目標(biāo)針對(duì)性構(gòu)建特征庫,人工工作量很大,通用性不足。此外,由于特征庫是針對(duì)已有的Webshell構(gòu)建的,因此新Webshell檢測效果也有限。(2)基于機(jī)器學(xué)習(xí)的檢測,茅雨綺等人提出的基于抽象語法樹和XGBoost的JSP Webshell檢測[6],提取出Java文件的語法樹,抽象出特征序列,以特征序列作為輸入樣本進(jìn)行檢測。詞向量提取中,茅雨綺等人對(duì)比了三種不同的特征提取算法,分別是TF-IDF,Word2Vec,Glove,機(jī)器學(xué)習(xí)算法選擇對(duì)比了XGBoost、KNN、支持向量機(jī)、隨機(jī)森林四種機(jī)器學(xué)習(xí)算法,最終得出結(jié)論Glove+XGBoost的組合可以得到更好的效果。(3)基于深度學(xué)習(xí)的檢測,周子恒等人在提取了PHP文件的操作碼之后,使用word2vec轉(zhuǎn)換詞向量,利用RNNs-LSTM算法對(duì)PHP樣本進(jìn)行分類,準(zhǔn)確率達(dá)到了95%[10]。傅建明等人是基于提取了PHP文件操作碼之后,使用詞匯表模型對(duì)文件進(jìn)行表示,然后使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)Webshell文件進(jìn)行分類,F(xiàn)1值達(dá)到了97.2%[12]。
根據(jù)前人研究經(jīng)驗(yàn),大部分學(xué)術(shù)論文選擇研究PHP類型的Webshell檢測,主要是由于以下兩點(diǎn),一是特征提取便捷,可以通過現(xiàn)成的庫提取opcode,轉(zhuǎn)而作為深度學(xué)習(xí)的特征進(jìn)行輸入,二是網(wǎng)絡(luò)上公開的PHP Webshell較多,可以有效的進(jìn)行計(jì)算。但是在樣本集不變,特征提取手段不變的前提下,大部分的論文的實(shí)驗(yàn)結(jié)果都是在95%上下,可是無法應(yīng)用到實(shí)際場景中。本文采用了將文本轉(zhuǎn)化為灰度圖像,使用圖像檢測CNN方法,進(jìn)行判斷,具體流程如圖1。
圖1 研究過程
由于Webshell的檢測與傳統(tǒng)的分類問題不太一樣,更加在意Webshell的破壞威力,所以希望是在盡可能提高查全率的同時(shí)降低誤報(bào)率,我們采用混淆矩陣的方式來展示最終的結(jié)果,并對(duì)惡意樣本的查準(zhǔn)率和查全率進(jìn)行比較。
表1 混淆矩陣
針對(duì)JSP類型的Webshell文件網(wǎng)絡(luò)公開數(shù)據(jù)較少的情況,我們收集了網(wǎng)絡(luò)上公開的Webshell倉庫,從中提取了400多個(gè)JSP類型的Webshell文件,再由東巽科技(北京)有限公司提供了2233個(gè)惡意JSP樣本,經(jīng)過去重后,得到2413個(gè)異常樣本數(shù)據(jù),正常樣本的收集是獲取了gitee.com上使用“JSP”作為關(guān)鍵詞搜索倉庫的前100頁所有倉庫中除惡意樣本外的所有JSP文件。去重過后得到3360個(gè)正常樣本。
JSP類型的Webshell樣本操作碼沒有公開庫可以提取,所以自然也就不能按照PHPWebshell的檢測方式進(jìn)行檢測,我們嘗試了幾種實(shí)現(xiàn)方式,最終選擇了使用灰度圖表示文件的形式進(jìn)行處理。傳統(tǒng)的文本文件處理始終是圍繞著詞的維度作為特征進(jìn)行輸入,十分依賴詞的拆分或是token的提取與表示,從之前的tfidf,word2vec到后來的Bert、GPT3,圍繞著詞的維度在對(duì)文本進(jìn)行處理,但是考慮到Webshell檢測這個(gè)任務(wù)屬于一個(gè)二分類任務(wù),更多的是偏向判定是或不是這個(gè)問題,就和最開始的圖像識(shí)別問題很相似。圖像識(shí)別也可以是對(duì)一個(gè)圖像進(jìn)行判斷,屬不屬于這個(gè)類別的問題,極其相似的任務(wù)目標(biāo)下,我們應(yīng)該做的就是找出文本的特征。
對(duì)于JSP類型的Webshell而言,特征其實(shí)就是它導(dǎo)入的包和對(duì)這些包進(jìn)行操作的語句,傳統(tǒng)的檢測方式可以是對(duì)關(guān)鍵函數(shù)進(jìn)行特征編碼,作為深度學(xué)習(xí)網(wǎng)絡(luò)的輸入,如PHP中的eval、system、cmd_shell、readdirl函數(shù),如果套用到JSP類型中就是對(duì)Java語句中java.io.FileOutputStream、application.getRealPath等語句。但實(shí)際上,每一個(gè)操作函數(shù)單獨(dú)作為一個(gè)特征可以,也可以被多個(gè)特征組合起來共同標(biāo)記,如eval,我們認(rèn)為eval是由四個(gè)字母組成,當(dāng)這四個(gè)字母按照相同順序、相鄰的出現(xiàn)在同一行的時(shí)候,也可以認(rèn)為這個(gè)特征是成立的。基于這個(gè)想法,我們希望能夠嘗試著將這種特征刻畫并提取出來。
在獲取到數(shù)據(jù)集并進(jìn)行去重過后,我們需要對(duì)樣本進(jìn)行預(yù)處理,我們將JSP文件通過tomcat服務(wù)器提供的接口轉(zhuǎn)換為Java文件進(jìn)行對(duì)比試驗(yàn)。考慮到代碼編寫,所以我們?nèi)コ俗⑨尯椭形淖址?,這里我們默認(rèn)中文字符不會(huì)參與到Java代碼中,只會(huì)出現(xiàn)在JSP的HTML結(jié)構(gòu)中。然后對(duì)剩余所有的字符通過python的ord函數(shù)轉(zhuǎn)換為對(duì)應(yīng)的ASCII值。這個(gè)時(shí)候一個(gè)文本就可以由大量的0到128表示了。通過對(duì)擁有樣本的分析可以發(fā)現(xiàn),正常樣本的行數(shù)遠(yuǎn)遠(yuǎn)小于異常樣本的行數(shù),即惡意樣本有可能會(huì)充斥大量無關(guān)字符進(jìn)行干擾判斷,且異常樣本中可能包含類似“u006fu0075u0074”這種字符,實(shí)際上是將JSP文件中的Java代碼部分做了unicode編碼,通過混淆編碼的方式繞過傳統(tǒng)的Webshell檢測機(jī)制。我們選擇保留了這部分代碼,并沒有選擇轉(zhuǎn)碼回去,這樣的話,后續(xù)如果有這樣的異常樣本出現(xiàn),特征也會(huì)更加明顯。
JSP/Java文件轉(zhuǎn)碼完成后,我們對(duì)不滿一百個(gè)字符的行末尾補(bǔ)0,按行區(qū)分,構(gòu)建出一個(gè)1000*100的灰度圖像,文件多余的部分截掉,行數(shù)不足的補(bǔ)0。生成的圖像中每一個(gè)像素點(diǎn)都是之前文件的一個(gè)字母或標(biāo)點(diǎn)。如圖2所示,第一行的圖像是異常樣本的灰度圖像,第二行是正常樣本的灰度圖像。圖3表示截取了生成圖像的前100行像素。
圖2 異常樣本與正常樣本生成灰度圖像對(duì)比圖
考慮到實(shí)際收集到的樣本數(shù)量較少,對(duì)于大型的網(wǎng)絡(luò)結(jié)構(gòu)偏差會(huì)比較大,所以對(duì)于這種圖像處理的方式采用的是較為簡單的CNN網(wǎng)絡(luò)結(jié)構(gòu)。網(wǎng)絡(luò)結(jié)構(gòu)如下,先通過3*3*1的卷積網(wǎng)絡(luò),然后通過一個(gè)2×2的最大池化層,重復(fù)三次,接著將經(jīng)過池化的向量拉成一維向量,通過隱層維度分別為256,128,64的全連接層,匯總到一個(gè)維度中,除了輸出層使用的是sigmoid激活函數(shù)外,其余各層激活函數(shù)選擇的都是ReLU。實(shí)際網(wǎng)絡(luò)結(jié)構(gòu)如圖4。
圖3 截取異常樣本與正常樣本生成灰度圖像對(duì)比圖
圖4 網(wǎng)絡(luò)結(jié)構(gòu)
我們的對(duì)JAVA和JSP兩種類型的文件分別進(jìn)行訓(xùn)練,將原始樣本以4:1的比例拆分為訓(xùn)練集和測試集進(jìn)行訓(xùn)練,訓(xùn)練20個(gè)epoch,batch大小選擇10,優(yōu)化器選擇Adam,參數(shù)設(shè)定為:learning_rate=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-07,從第13個(gè)epoch開始,訓(xùn)練集的分類準(zhǔn)確率就已經(jīng)達(dá)到了1,這也符合我們的預(yù)期,因?yàn)閃ebshell檢測需要能夠?qū)σ阎臉颖具M(jìn)行完全正確的分類。共計(jì)訓(xùn)練20個(gè)epoch之后,JSP類型的測試結(jié)果如表一所示,Java類型文件測試結(jié)果如表2所示。關(guān)于兩種類型測試集總和數(shù)量差了100多個(gè)樣本的原因是,在tomcat將JSP轉(zhuǎn)碼為Java文件的過程中,有少量JSP樣本由于語法錯(cuò)誤無法轉(zhuǎn)碼成功,但是在JSP類型訓(xùn)練中還保留了下來,目的是為了提取其中的公共特征。
表2 JSP 類型CNN 測試集結(jié)果混淆矩陣
表3 JAVA 類型測試集結(jié)果混淆矩陣
本文在使用相較于其他研究較多的樣本后,得到的結(jié)果相比較而言也是較優(yōu)的,對(duì)比茅雨綺等人與趙瑞杰等人的研究結(jié)果如表4,可以看到,由于在訓(xùn)練過程中使得訓(xùn)練集上分類準(zhǔn)確度達(dá)到1,故在測試集上查全率是遠(yuǎn)高于前人研究結(jié)果的。
表4 對(duì)比前人結(jié)果與本文結(jié)果(JSP 類型)
本文提出了一種基于基于CNN的JSP類型Webshell檢測方法,以JSP和JSP編譯生成的Java文件的ASCII碼為原始數(shù)據(jù),轉(zhuǎn)換為1000*100的灰度圖像,對(duì)比CNN、隨機(jī)森林、XGBoost等主流的深度學(xué)習(xí)算法,得出ASCII+CNN模型在JSP類型的Webshell檢測中明顯占優(yōu),查全率相較于其他算法都有明顯的提升,查準(zhǔn)率同樣也是在第一梯隊(duì)的。在接下來的研究中,需要繼續(xù)收集原始Webshell樣本,并嘗試新的圖像檢測處理框架及自然語言處理算法,進(jìn)一步提升算法的適用性及魯棒性。