基於機器學習的WEB攻擊分類檢測模型
機器學習目前已有很多創新應用,例如攻防對抗、UEBA以及金融反欺詐等。基於機器學習的新一代WEB攻擊檢測技術有望彌補傳統規則集方法的不足,為WEB對抗的防守端帶來新的發展和突破。
本文是作者近十年安全領域工作總結出的人工智慧實戰初探,首先採用聚類模型,將正常資料和已知攻擊型別的資料形成樣本簇,過濾掉異常資料之後送入分類模型對資料進行分類,從而發現新型WEB攻擊行為。
系統架構圖設計
分類檢測流程圖
一、日誌預處理
目前常見的網路安全攻擊型別主要包括:
編號 | 攻擊型別 |
---|---|
0 | 正常 |
1 | SQL 注入 |
2 | 缺失報頭 |
3 | 爬蟲 |
4 | 跨站指令碼攻擊 |
5 | 漏洞防護 |
6 | 掃描工具 |
7 | 協議違規 |
8 | 針對ie8的跨站攻擊 |
本文主要針對最常見的SQL注入攻擊和跨站指令碼攻擊進行介紹。
1.SQL 注入:
SQL 注入其實就是攻擊者通過操作輸入修改後臺數據庫的語句,執行程式碼從而達到攻擊的目的。URL地址中的引數經常與資料庫SQL語句中各引數相關聯,攻擊者通過構造引數很容易會引起SQL注入的問題,所以攻擊者通常會在引數中注入資料庫專用語言和關鍵字。
2.XSS 攻擊:
即跨站指令碼攻擊,曾被OWASP評為Web攻擊中最危險的攻擊,XSS攻擊可分為儲存型XSS和反射型XSS,其構造方法是在URL地址的請求引數中加入指令碼程式碼,本質上是一種針對HTML的注入攻擊 。
基於機器學習的WEB攻擊分類檢測模型主要對URL進行分析:包括數字處理、字母處理、字元處理及文字結構分析,SQL注入和XSS攻擊具有關鍵詞、數字佔比較高等顯著特徵,通過文字分析進行統計處理,將明顯的特徵點提取出來作為後續分類的特徵向量。
二、聚類模型構建:
監督學習都需要一個訓練階段,牽涉到缺陷學習階段的引入,使得基於監督學習的WEB攻擊檢測模型設計變得較為複雜。首先需要為模型的學習準備訓練樣本集,並對訓練樣本分類打標記,這些都需要大量的人工參與。監督學習方法的檢測效能對訓練的好壞具有很大的依賴性,訓練樣本集的完備性和訓練樣本標記的正確性都會影響方法在檢測階段的效能表現。
通過對日誌和流量資料進行分析發現以下特徵:
1) 90% 以上都是正常的訪問請求,惡意的攻擊行為佔總請求量很小一部分;
2) 正常訪問的引數形式之間變化很小,具有很好的聚類特性;
3) 惡意攻擊與正常樣本模式之間有較大的差異,聚類特性較差。
通常正常流量是大量重複性存在的,而入侵行為則極為稀少。因此我們選取K-means構造能夠充分表達白樣本的最小模型作為Profile,實現異常檢測。
我們通過訓練大量正常樣本以及已知的攻擊型別樣本,過濾掉未知的攻擊行為,為我們後續分類器的準確度提供了保證。
以下程式碼實現瞭如何使用聚類演算法形成樣本簇,判斷是否異常,過濾掉異常資料並將資料送入分類器模型。
三、分類檢測模型構建
以上介紹瞭如何利用聚類演算法對異常攻擊行為進行過濾,為下一步構造多分類檢測模型打好基礎,目前主流分類器包括SVM、隨機森林、xgboost等演算法,本文選擇隨機森林演算法,後續也會增加xgboost的實現。
隨機森林演算法把分類樹組合成隨機森林,即在變數(列)的使用和資料(行)的使用上進行隨機化,生成很多分類樹,再彙總分類樹的結果。隨機森林在運算量沒有顯著提高的前提下提高了預測精度。隨機森林對多元共線性不敏感,結果對缺失資料和非平衡的資料比較穩健,可以很好地預測多達幾千個解釋變數的作用。
隨機森林的主要優點有:
1) 訓練可以高度並行化,對於大資料時代的大樣本訓練速度有優勢;
2) 由於可以隨機選擇決策樹節點劃分特徵,這樣在樣本特徵維度很高的時候,仍然能高效的訓練模型;
3) 在訓練後,可以給出各個特徵對於輸出的重要性;
4) 由於採用了隨機取樣,訓練出的模型的方差小,泛化能力強;
5) 相對於Boosting系列的Adaboost和GBDT,隨機森林實現比較簡單;
6) 對部分特徵缺失不敏感;
7) 對資料集的適應能力強:既能處理離散型資料,也能處理連續型資料,資料集無需規範化;
8) 在建立隨機森林的時候,對generlization error使用的是無偏估計;
9) 訓練過程中,能夠檢測到feature間的互相影響。
隨機森林也有一些缺點,包括:
1) 在某些噪音比較大的樣本集上,隨機森林模型容易陷入過擬合;
2) 取值劃分比較多的特徵容易對隨機森林的決策產生更大的影響,從而影響擬合的模型的效果。
將已知WEB攻擊和正常訪問文字抽象成多個特徵向量,再將特徵向量輸送到隨機森林中,對其進行分類得出分類模型,最後對新的訪問文字進行模式識別,發現新型WEB攻擊行為。整個分類檢測模型由 3 個元件組成:
1)文字分析 :
包括數字處理、字母處理、字元處理及文字結構分析,針對WEB攻擊型別中的每種工具,如SQL注入,典型 SQL 注入具有包含SQL關鍵詞、數字佔比較高等顯著特徵,文字分析主要進行一些統計上的處理,將一些明顯的特徵點提取出來作為分類的特徵向量。
2)特徵提取 :
包括特徵詞及權重、關鍵詞和特定資訊,特徵提取主要是將WEB攻擊型別中的每種攻擊,如SQL注入的關鍵詞作為空間向量模型的關鍵詞,採用分詞的方法將字串的詞語剝離出來,再統計詞頻,對映到空間向量中。
3)分類 :
包括隨機森林演算法、模型訓練、分類器和分類結果,分類主要是選取impurity, maxDepth, maxBins, numTrees的一些引數,經過訓練產生分類器,得出分類結果。
3.1 文字分析
文字分析對樣本進行資料統計並將樣本對映為空間向量。統計項主要有:典型 SQL注入關鍵詞是否存在、樣本文字中數字字元百分比、大寫字元百分比、截斷字元百分比、特殊字元百分比等。應用空間向量模型對文字樣本進行對映可以得出此文字空間的特徵向量值。
3.2 基本特徵的提取
級別 | SQl 惡意關鍵字 |
---|---|
High | and,or,xp_,substr,utl_,benchmark,shutdown,@@version,mformation_schema,hex( |
Middle | Select,if(,union,group,by,–,count(,/**/,char(,drop,delete,concat,orderby,case when,assic(,exec(,length |
Low | and,or,like,from,insert, update,create,else, exist,table ,database,Where,sleep,mid,updatexml(,null,sqlmap,md5(,floorm,rand,cast,dual,fetch,print,declare,cursor,extractvalue(,upperjoin,exec,innier,convert,distinct |
級別 | Xss 惡意關鍵字 |
---|---|
High | <scrip, </script, <iframe, </iframe,response,write(,eval(,prompt(,alert(,javascript;,document,cookie |
Middle | Onclick=,onerror=,<!–,–>,<base,</base>>,location,hash,window,name,<form,</form |
Low | echo,print,href=,sleep |
樣本資料中如果存在SQL注入常用關鍵詞則特徵值為1,如果不存在則特徵值為0。但是通常訪問文字是一串字串,而且字串的內容因網站設計的不同差異性很大,因此首先要對訪問文字進行分詞處理。因為URL字串只能是 ASCII 碼,而且不同的應用對資料進行了不同的封裝和顯示處理,如果根據其他的規則分詞,準確率就會大大降低。所以本文只採用 3 種字元進行分詞:“空格”、“/”和“&” 。
SQL 注入和XSS攻擊的基本型別和變形的內容可以通過統計的方法對訪問字串進行詞頻統計,統計內容包括:
1)大寫字元在字串中所佔的比例,根據 SQL 注入中的變形攻擊將查詢語句中部分字元的大小寫進行轉化,來避開過濾器的檢測;
2)空格字元在字串中所佔的比例,主要針對空字元攻擊;
3)特殊字元在字串中所佔的比例,主要是閉合截斷字元,常見的閉合截斷字元有: “{}”“[]”“=”“? ”“#”“/” “ style=”font-size: 16pt; color: black;”>< ” “ > style=”font-size: 16pt; color: black;”>” “ ! ”# % & ’ : ; < > = ? @ [ ] \/ {} $ , * + - ”等。主要針對內聯註釋序列和截斷字元變形攻擊;
4)數字字元在字串中所佔的比例,主要針對動態查詢變形攻擊。
類別 | 序號 | 特徵名稱 | 特徵描述 |
---|---|---|---|
語法特徵 | 1 | URL_len | URL 長度 |
2 | Path_len | 路徑長度 | |
3 | Path | 路徑最大長度 | |
4 | Path_Maxlen | 路徑平均長度 | |
5 | Argument_len | 引數部分長度 | |
6 | Name_Max_len | 引數名最大長度 | |
7 | Name_Avglen | 引數名平均長度 | |
8 | Value_Max_len | 引數值最大長度 | |
9 | Value_Avg_len | 引數值平均長度 | |
10 | Argument_len | 引數個數 | |
11 | String_Max_len | 字串最大長度 | |
12 | Number_Maxlen | 連續數字最大長度 | |
13 | Path_number | 路徑中的數字個數 | |
14 | Unknow_len | 特殊字元的個數 | |
15 | Number_Percentage | 引數值中數字佔有比例 | |
16 | String_Percentage | 引數值字母佔有比例 | |
17 | Unkown_Percentage | 引數值中特殊字元的比例 | |
18 | BigString_Percentage | 大寫字元所佔比例 | |
19 | Spacing_Precentage | 空格字元所佔比例 | |
領域特徵 | 19 | ContainIP | 引數值是否包含IP |
20 | Sql_Risk_level | SQL 型別危險等級 | |
21 | Xss_Risk_level | Xss 型別危險等級 | |
22 | Others_Risk_level | 其他型別危險等級 |
初始提取的特徵如表
3.3 詞袋模型
機器學習演算法的實現首先是要構造好的特徵向量,在類似的分類演算法中比較好的是首先通過N-Gram將文字資料(URL)向量化,比如對於下面的例子,如果N取2,步長為1,則:
style="color: black;">www.xxx.com.cn/api/user/getMessagehttp
去掉主機名得到:
api/user/getMessagehttp
用’ / ’分詞 得到:
api,user, getMessagehttp
[api user 和user getMessagehttp]
然後計算TF-IDF,詞頻—逆文件頻率(簡稱TF-IDF)是一種用來從文字文件(例如URL)中生成特徵向量的簡單方法。它為文件中的每個詞計算兩個統計值:一個是詞頻(TF),也就是每個詞在文件中出現的次數,另一個是逆文件頻率(IDF),用來衡量一個詞在整個文件語料庫中出現的(逆)頻繁程度。這些值的積,也就是TF×IDF,展示了一個詞與特定文件的相關程度(比如這個詞在某文件中很常見,但在整個語料庫中卻很少見)。
N-Gram 的分詞方法乍一看好像沒什麼道理,因為一般的特徵向量的構造是提取的特徵關鍵詞。比如如果我們將向量定義為script、select、union、eval等詞出現的詞頻,那就很好理解,因為那些詞都是惡意關鍵詞,在正則匹配中一般也會攔截。但其實N-Gram也是一樣的效果,一個特定的關鍵詞會被切分成特定的序列,比如select被分成[sel,ele,lec,ect],而其他的正常的詞一般不會出現這樣的序列。其中N的取值需要進行多次試驗,不同的演算法最佳值不同。
特徵提取主要是將SQL注入的關鍵詞作為空間向量模型的關鍵詞,採用分詞的方法將字串的詞語剝離出來,再統計詞頻,對映到空間向量中,
SQL 注入的主要載體為訪問的URL字串,將這段字串看成是一個文字,首先進行分詞,分詞之後就可以構建 URL字串所對應的空間向量,空間向量中的每個特徵即是所存在的SQL注入特徵關鍵詞,詞頻可以用來統計,而權重則取決於逆文件率。
最終特徵:
【分詞生成特徵向量 + 統計特徵 + 基本特徵(敏感關鍵詞個數) 】
目前存在的問題是利用TF-IDF產生的特徵向量極度依賴訓練集,當測試機中某一關鍵字未出現,則TF-IDF產生的特徵向量也將不包含,而提取的統計特徵現在只針對SQL注入及XSS攻擊有領域特徵,對於其他攻擊型別的特徵提取直接決定了WEB攻擊檢測精度。
四、分類檢測模型訓練
4.1 分類檢測模型實現
隨機森林是一個包含多個決策樹的分類器,其輸出的類別是由個別樹輸出的類別的眾數而定。決策樹演算法家族能自然地處理類別型和數值型特徵。決策樹演算法容易並行化,它們對資料中的離群點(outlier)具有魯棒性(robust),這意味著一些極端或可能錯誤的資料點根本不會對預測產生影響。演算法可以接受不同型別和量綱的資料,對資料型別和尺度不相同的情況不需要做預處理或規範化。
在決策樹的每層,演算法並不會考慮所有可能的決策規則。如果在每層上都要考慮所有可能的決策規則,演算法的執行時間將無法想象。對一個有 N 個取值的類別型特徵,總共有 2N – 2 style=”font-size: 16pt; color: black;”>個可能的決策規則(除空集和全集以外的所有子集)。即使對於一個一般大的 N,這也將建立數十億候選決策規則。
相反,決策樹使用一些啟發式策略,能夠聰明地找到需要實際考慮的少數規則。在選擇規則的過程中也涉及一些隨機性;每次只考慮隨機選擇少數特徵,而且只考慮訓練資料中一個隨機子集。在犧牲一些準確度的同時換回了速度的大幅提升,但也意味著每次決策樹演算法構造的樹都不相同。
4.2 交叉驗證與評價指標
本文對WEB攻擊分類檢測模型評估指標選用的是精確率(Precision)、召回率(Recall)和F1值(F-Measure),在二分類問題中,一個樣本的檢測結果通常會出現四種情況:
1.TP:(TruePositive)正樣本被模型預測為正,稱作判斷為真的正確率;
2.TN:(TrueNegative):負樣本被模型預測為負,稱作判斷為假的正確率;
3.FP:(FalsePositive):負樣本被模型預測為正,稱作誤報率;
4.FN:(FasleNegative):正樣本被模型預測為負,稱作漏報率。
評估指標用上述名詞表示如下:
Precision(精確率)=TP/(TP+FP) Recall(召回率)=TP/(TP+FN)
F_Measure 則是Precision與Recall的加權平均。
當精確率和召回率同時都高的時候,F1值才會高,因此F1值能夠全面的評估URL分類模型的效能,即在滿足高準確率的情況下也要保證高召回率。多類分類評估指標和二分類評估指標計算方式有所不同,多分類時把每個類別分別看做正樣本,所有其它樣本視為負樣本,分別計算各個類別的精確率、召回率和F1值,然後再對所有類的指標求算術平均值作為多分類模型的最後評估結果。
攻擊型別編號:
編號 | 攻擊型別 |
---|---|
0 | 正常 |
1 | SQL 注入 |
2 | 缺失報頭 |
3 | 爬蟲 |
4 | 跨站指令碼攻擊 |
5 | 漏洞防護 |
6 | 掃描工具 |
7 | 協議違規 |
8 | 針對ie8的跨站攻擊 |
訓練集
正常流量F1
0.9391002297047453
SQL 注入F1
0.9567709186179794
爬蟲F1
0.7716240805761294
漏洞防護F1
0.9021054675580459
跨站指令碼攻擊F1
0.7221889055472264
缺失報頭F1
0.9634720123185718
掃描工具F1
0.5475933908045977
協議違規F1
0.6563775510204082
針對ie8的跨站攻擊F1
0.6810157194679565
混淆矩陣:
編號 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
0 | 16762 | 0 | 60 | 222 | 196 | 23 | 89 | 586 | 15 |
1 | 127 | 11686 | 92 | 5 | 95 | 3 | 1 | 97 | 0 |
2 | 48 | 0 | 15054 | 614 | 119 | 101 | 838 | 1129 | 39 |
3 | 395 | 53 | 712 | 16260 | 166 | 7 | 250 | 111 | 23 |
4 | 99 | 188 | 309 | 98 | 14451 | 9 | 931 | 1257 | 642 |
5 | 12 | 0 | 660 | 187 | 31 | 16894 | 74 | 80 | 5 |
6 | 84 | 52 | 3418 | 258 | 485 | 46 | 9147 | 4179 | 364 |
7 | 152 | 245 | 502 | 226 | 677 | 30 | 3282 | 12865 | 28 |
8 | 66 | 98 | 270 | 202 | 5816 | 13 | 763 | 889 | 9856 |
測試集
正常流量F1
0.9318407960199004
SQL 注入F1
0.9606017191977076
爬蟲F1
0.7713125845737483
漏洞防護F1
0.8954344624447718
跨站指令碼攻擊F1
0.6946902654867257
缺失報頭F1
0.9616342800199303
掃描工具F1
0.5380181169365907
協議違規F1
0.6589411497386958
針對ie8的跨站攻擊F1
0.6376456161863887
混淆矩陣:
編號 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
0 | 1873 | 0 | 7 | 32 | 30 | 2 | 23 | 75 | 5 |
1 | 14 | 1341 | 9 | 0 | 15 | 1 | 0 | 12 | 0 |
2 | 4 | 0 | 1710 | 76 | 21 | 7 | 92 | 139 | 9 |
3 | 45 | 3 | 87 | 1824 | 18 | 0 | 32 | 13 | 1 |
4 | 10 | 20 | 26 | 10 | 1570 | 3 | 103 | 148 | 126 |
5 | 0 | 0 | 76 | 29 | 5 | 1930 | 8 | 8 | 1 |
6 | 9 | 7 | 381 | 29 | 60 | 7 | 980 | 448 | 46 |
7 | 10 | 24 | 51 | 22 | 86 | 2 | 341 | 1450 | 7 |
8 | 8 | 5 | 29 | 29 | 699 | 5 | 97 | 115 | 1040 |
從訓練集對訓練結果進行分析,測試集類似。
觀察每個類別的F1值(綜合了查準率與查全率)發現:
爬蟲 ,跨站指令碼攻擊,掃描工具,協議違規針對ie8的跨站指令碼攻擊值F1值較低,其餘的F1值較高,大概在百分之九十多。
從訓練集混淆矩陣分析發現:
1)爬蟲 ,跨站指令碼攻擊,掃描工具,協議違規,針對ie8的跨站指令碼攻擊大約有兩萬條;
2)爬蟲 ,跨站指令碼攻擊,掃描工具,協議違規,針對ie8的跨站指令碼攻擊被正確分類的個數依次為:15054,14451,9147,12865,9856;
3)爬蟲被誤分類為協議違規(1129條),掃描工具(838條),漏洞防護(614條);
4)跨站指令碼攻擊容易被誤分類為協議違規(1257條),掃描工具(931條),針對ie8的跨站指令碼攻擊(642條);
5)掃描工具容易被誤分類為協議違規(4179條),爬蟲(3418條 );
6)協議違規容易被誤分類為掃描工具(3282條 ),跨站指令碼攻擊(677條),爬蟲(502條);
7)針對ie8的跨站指令碼攻擊最容易被誤分類跨站指令碼攻擊(58160),其次是協議違規(889條),掃描工具(763條)。
綜上所述:
XSS 攻擊與針對ie8的跨站指令碼攻擊payload較為相似,協議違規,掃描工具,爬蟲payload也較為接近,下階段需要進一步細分對這些攻擊類別的判別方式,從而設計特徵進行區分。
*本文原創作者:SS萊斯,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載