鄧全才 郭雅靜 張子翼
(河北建筑工程學(xué)院數(shù)理系,河北 張家口 075000)
Web應(yīng)用(網(wǎng)站)已滲透到電子商務(wù)、教育、社交網(wǎng)絡(luò)等眾多領(lǐng)域.網(wǎng)絡(luò)入侵事件時(shí)有發(fā)生,當(dāng)黑客入侵成功后,WebShell被攻擊者上傳至Web服務(wù)器,用于控制Web服務(wù)主機(jī),非法訪問網(wǎng)站資源,甚至控制具有Web功能的關(guān)鍵設(shè)施,嚴(yán)重威脅著國家網(wǎng)絡(luò)空間安全,Web的安全問題變的日益嚴(yán)峻.因此,對WebShell檢測技術(shù)的研究是有必要而且有意義的[1].
Web通常具有允許用戶進(jìn)行文件上傳、下載的功能.但是,如果下載檢測程序未嚴(yán)格檢測下載文件的格式,或者服務(wù)器軟件中有解析漏洞,那么它就可以使黑客能夠下載WebShell并對其進(jìn)行解析,從實(shí)現(xiàn)對網(wǎng)站的控制.WebShell是一種可以進(jìn)行文件操作和命令執(zhí)行的惡意程序.WebShell通過Web服務(wù)獲得Web服務(wù)器的管理權(quán)限,從而對Web服務(wù)器進(jìn)行深入滲透和控制.WebShell中“Web”指Web服務(wù)器的服務(wù)功能,“Shell”指為使用者提供服務(wù)的一些操作權(quán)限,如文件管理、數(shù)據(jù)庫連接、命令執(zhí)行等.
WebShell根據(jù)腳本可以分為PHP腳本木馬,ASP腳本木馬, .NET腳本木馬、JSP腳本木馬、以及與python網(wǎng)頁相關(guān)的WebShell.攻擊者在入侵一個(gè)Web站點(diǎn)時(shí),將這些腳本文件上傳至Web服務(wù)器目錄下.通過瀏覽器訪問的方式,訪問腳本文件的同時(shí),可以控制Web服務(wù)器[2],如果Web權(quán)限比較高,甚至可以直接運(yùn)行系統(tǒng)命令.WebShell具體分類如圖1所示[3].
圖1 WebShell分類
WebShell主要有兩方面的作用[4],一是用于Web服務(wù)器的管理等;另一方面可以被入侵者利用,從而達(dá)到控制目標(biāo)服務(wù)器的目的.除了以上作用外,WebShell還有其它更多豐富的功能:探測服務(wù)器上是否存在其他WebShell、連接數(shù)據(jù)庫、集成其它提權(quán)工具等.WebShell作為一個(gè)惡意動(dòng)態(tài)腳本,具有隱蔽性,可以利用服務(wù)器漏洞進(jìn)行隱藏,其通信和普通網(wǎng)頁一樣都是通過服務(wù)器軟件端口(默認(rèn)為80端口),因此不會(huì)被防火墻攔截.
ADFA-LD數(shù)據(jù)集[5]是澳大利亞國防學(xué)院對外發(fā)布的一套主機(jī)級入侵檢測系統(tǒng)的數(shù)據(jù)集合,被廣泛應(yīng)用于入侵檢測類產(chǎn)品的測試.ADFA-LD數(shù)據(jù)集已經(jīng)將各類系統(tǒng)調(diào)用完成了特征化,并針對攻擊類型進(jìn)行了標(biāo)注,其中攻擊類型為WebShell的數(shù)據(jù)集放在ADFA-LD文件下,數(shù)據(jù)集分為三組,每一組都包含了原始系統(tǒng)調(diào)用順序.每個(gè)訓(xùn)練集(Training_Data_Master)和驗(yàn)證集(Validation_Data_Master)的數(shù)據(jù)都是在主機(jī)的正常操作過程中收集的.其中訓(xùn)練集數(shù)據(jù)大小在300比特到6kb之間,驗(yàn)證集數(shù)據(jù)在300kb到10kb之間.攻擊數(shù)據(jù)集(Attack_Data_Master)里共有6種攻擊方式.
用x=和y=兩個(gè)變量分別存儲(chǔ)正常數(shù)據(jù)和異常數(shù)據(jù),并設(shè)置正常數(shù)據(jù)標(biāo)簽為0,異常數(shù)據(jù)標(biāo)簽為1.通過train_test_split函數(shù)隨機(jī)分配訓(xùn)練集和測試集,訓(xùn)練集數(shù)據(jù)和測試集數(shù)據(jù)的比例為7:3,random_size:設(shè)置隨機(jī)數(shù)種子,通過設(shè)定為相同的數(shù)值,使每次分割的結(jié)果都相同,具體實(shí)現(xiàn)如下所示.
x_train,x_test,y_train,y_test=train_test_split(x,y,test size=0.3,random_state=9)
測試數(shù)據(jù)使用和訓(xùn)練數(shù)據(jù)一樣的詞匯表:使用詞袋模型轉(zhuǎn)換為系統(tǒng)調(diào)用向量.運(yùn)用詞袋模型,把所有的詞匯裝到一個(gè)袋子里,不考慮其詞法和詞序的問題,即每個(gè)詞匯都是獨(dú)立的.權(quán)重只與每個(gè)單詞出現(xiàn)的頻率有關(guān).詞袋模型會(huì)先進(jìn)行分詞,通過統(tǒng)計(jì)每個(gè)詞匯出現(xiàn)的次數(shù),就可以得到該文本基于詞匯的特征,將文本中的詞匯與其對應(yīng)的詞頻放在一起即為向量化.
采用Pytorch分別構(gòu)建BP神經(jīng)網(wǎng)絡(luò)和LSTM神經(jīng)網(wǎng)絡(luò)模型.Pytorch是一個(gè)開源的Python機(jī)器學(xué)習(xí)庫,一個(gè)以Python優(yōu)先的深度學(xué)習(xí)框架.
BP神經(jīng)網(wǎng)絡(luò)的層數(shù)設(shè)為4層,其中隱藏層層數(shù)為2層,第1層隱藏層有100個(gè)神經(jīng)元,第2層隱藏層有50個(gè)神經(jīng)元.激活函數(shù)為logistic函數(shù),也就是sigmoid函數(shù),權(quán)重優(yōu)化采用隨機(jī)梯度下降算法,最大迭代次數(shù)為100.初始學(xué)習(xí)率設(shè)置為0.001.
模型的具體實(shí)現(xiàn)步驟如下:
1.定義LSTM神經(jīng)網(wǎng)絡(luò)模型,通過繼承nn.Module類來實(shí)現(xiàn).同時(shí),定義輸入x的特征維度為124,隱藏層的層數(shù)默認(rèn)為1,隱藏層的特征維度(隱藏層神經(jīng)元)為100.創(chuàng)建LSTM層提取特征和Linear層用作最后的預(yù)測,LSTM算法通過三個(gè)不同的因素來控制之前信息對當(dāng)前信息的影響:先前的隱藏狀態(tài),先前的單元狀態(tài)和當(dāng)前輸入.
2.定義好每層之后,通過forward函數(shù)以前向傳播的方式將相鄰的兩層串起來,即如何根據(jù)輸入x計(jì)算返回所需要的模型輸出.forward函數(shù)的任務(wù)需要把輸入層、隱藏層、輸出層連接起來,該函數(shù)的參數(shù)一般為輸入數(shù)據(jù),返回值是輸出數(shù)據(jù).
3.將數(shù)據(jù)集轉(zhuǎn)換為tensor,Pytorch使用張量tensor存儲(chǔ)數(shù)據(jù),并將訓(xùn)練數(shù)據(jù)轉(zhuǎn)換為輸入序列和相應(yīng)的標(biāo)簽.
4.模型訓(xùn)練:設(shè)置迭代次數(shù)為100次.每組數(shù)據(jù)有20個(gè),學(xué)習(xí)率為0.001.enumerate函數(shù)用于在循環(huán)中得到計(jì)數(shù),利用它可以同時(shí)獲得索引、步數(shù)和值.梯度初始化為0,應(yīng)用反向傳播求梯度,防止梯度爆炸或者梯度過小時(shí),設(shè)定閾值,當(dāng)梯度小于/大于閾值時(shí),更新的梯度為閾值.設(shè)置步長為5,選取softmax函數(shù)作為分類函數(shù),softmax可以更好的處理多分類問題.該函數(shù)將多個(gè)神經(jīng)元的輸出映射到大于0小于1的區(qū)間內(nèi),輸出是屬于各個(gè)分類的概率,在最后選取輸出結(jié)點(diǎn)的時(shí)候,選取概率最大(多分類的輸出值對應(yīng)最大值)結(jié)點(diǎn),作為預(yù)測目標(biāo).
實(shí)驗(yàn)環(huán)境:操作系統(tǒng)為Windows 10,內(nèi)存8G,CPU:Intel(R)Core(TM)i5-10210U CPU@1.60GHz 2.11 GHz,開發(fā)語言為Python3.6,BP神經(jīng)網(wǎng)絡(luò)、LSTM神經(jīng)網(wǎng)絡(luò)檢測WebShell實(shí)驗(yàn)結(jié)果如圖2、圖3所示.
圖2 BP神經(jīng)網(wǎng)絡(luò)模型實(shí)驗(yàn)結(jié)果
從圖2可以發(fā)現(xiàn),BP神經(jīng)網(wǎng)絡(luò)雖然設(shè)置的最大迭代次數(shù)為100次,但是由于連續(xù)10個(gè)周期針對損失降低不超過0.001,故程序只迭代了61次,經(jīng)過訓(xùn)練測試模型loss值在0.03左右擺動(dòng),模型最終在測試集準(zhǔn)確率為:95%.
圖3 LSTM神經(jīng)網(wǎng)絡(luò)模型實(shí)驗(yàn)結(jié)果
圖3截取了LSTM模型訓(xùn)練測試中間結(jié)果和最終結(jié)果,可以發(fā)現(xiàn)模型loss值很小,模型在測試集上中間出現(xiàn)準(zhǔn)確率為100%的情況,然后隨著數(shù)據(jù)量的增加準(zhǔn)確率穩(wěn)定在了95%.
綜合上述分析,BP、LSTM兩個(gè)模型能較高準(zhǔn)確率檢測出WebShell的存在性,說明構(gòu)建的兩個(gè)神經(jīng)網(wǎng)絡(luò)模型在模型結(jié)構(gòu)、參數(shù)設(shè)置較合理,但是從結(jié)果來看BP模型的loss值高于LSTM模型loss近10倍,但兩個(gè)模型檢測精度最終均為95%,對于模型的解釋性有待進(jìn)一步研究.
本文針對Web站點(diǎn)存在的安全問題,WebShell進(jìn)行了介紹.通過構(gòu)建兩種不同的深度學(xué)習(xí)算法模型,分析了基于BP神經(jīng)網(wǎng)絡(luò)和LSTM網(wǎng)絡(luò)的兩種WebShell檢測技術(shù),為后續(xù)WebShell檢測技術(shù)的研究奠定了基礎(chǔ).