學點演算法搞安全之HMM(下篇)

2021-09-23 16:52:04 字數 3109 閱讀 9320

學點演算法搞安全之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多分鐘,面試官...