學點演算法搞安全之hmm(下篇)
前言
上篇我們介紹了hmm的基本原理以及常見的基於引數的異常檢測實現,這次我們換個思路,把機器當乙個剛入行的白帽子,我們訓練他學會xss的攻擊語法,然後再讓機器從訪問日誌中尋找符合攻擊語法的疑似攻擊日誌。
通過詞法分割,可以把攻擊載荷序列化成觀察序列,舉例如下:
詞集/詞袋模型
詞集和詞袋模型是機器學習中非常常用的乙個資料處理模型,它們用於特徵化字串型資料。一般思路是將樣本分詞後,統計每個詞的頻率,即詞頻,根據需要選擇全部或者部分詞作為雜湊表鍵值,並依次對該雜湊表編號,這樣就可以使用該雜湊表對字串進行編碼。
詞集模型:單詞構成的集合,集合自然每個元素都只有乙個,也即詞集中的每個單詞都只有乙個
詞袋模型:如果乙個單詞在文件**現不止一次,並統計其出現的次數
本章使用詞集模型即可。
假設存在如下資料集合:
dataset = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'i', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
首先生成詞彙表:
vocabset = set()
for doc in dataset:
vocabset |= set(doc)
vocablist = list(vocabset)
根據詞彙表生成詞集:
# 詞集模型
sow =
for doc in dataset:
vec = [0]*len(vocablist)
for i, word in enumerate(vocablist):
if word in doc:
vec[i] = 1
簡化後的詞集模型的核心**如下:
fredist = nltk.freqdist(tokens_list) # 單檔案詞頻
keys=fredist.keys()
keys=keys[:max] #只提取前n個頻發使用的單詞 其餘泛化成0
for localkey in keys: # 獲取統計後的不重複詞集
if localkey in wordbag.keys(): # 判斷該詞是否已在詞集中
continue
else:
wordbag[localkey] = index_wordbag
index_wordbag += 1
常見的xss攻擊載荷列舉如下:
%3cscript%3ealert(『xss』)%3c/script%3e
%22%3e%3cscript%3ealert(『xss』)%3c/script%3e
需要支援的詞法切分原則為:
單雙引號包含的內容 『xss』
http/https鏈結
<>標籤「οnmοuseοver=」confirm(document.domain);」" )
#分詞後:
['', '"οnmοuseοver="', 'confirm(document.domain)', '']
#原始引數值:「>
#分詞後:
['', '>', '']
結合詞集模型,完整的流程舉例如下:
訓練模型
將範化後的向量x以及對應的長度矩陣x_lens輸入即可,需要x_lens的原因是引數樣本的長度可能不一致,所以需要單獨輸入。
remodel = hmm.gaussianhmm(n_components=3, covariance_type=」full」, n_iter=100)
remodel.fit(x,x_lens)
整個系統執行過程如下:
驗證階段利用訓練出來的hmm模型,輸入觀察序列獲取概率,從而判斷觀察序列的合法性,訓練樣本是1000條典型的xss攻擊日誌,通過分詞、計算詞集,提煉出200個特徵,全部樣本就用這200個特徵進行編碼並序列化,使用20000條正常日誌和20000條xss攻擊識別(類似js****這類編碼的暫時不支援),準確率達到90%以上,其中驗證環節的核心**如下:
學點演算法(十一) 將二叉樹轉為陣列
今天我們來學習如何將二叉樹轉為陣列 填坑學點演算法 九 二叉樹中序遍歷演算法 遞迴實現 首先,我們看下面這棵二叉樹,我們從根節點出發,左右孩子依次排列在根節點後面,放入陣列中,然後繼續以同樣的方法遍歷其左右孩子,如果孩子節點的位置已經被叔父節點佔據,則繼續排在叔父節點後面,如果遇到沒有左右孩子的情況...
面試失敗之24點演算法
周一風塵僕僕 上午6點抵達成都 的去參加了凡客成都研發中心的面試,雖然經歷一夜的折騰讓我感覺頭腦很不清醒,不過這種面試狀態也不錯,能讓我深刻體驗一下在不清醒狀態下進行的思考和回答問題。午飯過後便出了門,習慣了不堵車,突然覺得成都的交通真的很擁堵。到達凡客成都研發中心填完錶後等了大概10多分鐘,面試官...
面試失敗之24點演算法
周一風塵僕僕 上午6點抵達成都 的去參加了凡客成都研發中心的面試,雖然經歷一夜的折騰讓我感覺頭腦很不清醒,不過這種面試狀態也不錯,能讓我深刻體驗一下在不清醒狀態下進行的思考和回答問題。午飯過後便出了門,習慣了不堵車,突然覺得成都的交通真的很擁堵。到達凡客成都研發中心填完錶後等了大概10多分鐘,面試官...