Using CNN to identify SQL and XSS
來篇正式點的Post吧
前言
我覺得CNN演算法就其本身而言,應用與NLP是沒有問題的。
但是這個檢測率應該可以再提升一點。
因為SQL,XSS的注入方法,就語法上而言,比NLP要簡單一些。
還可以用C寫一個檢測程式。
這樣就更容易讓這個模型跑在實際的環境。
而且,樣本在送檢之前,首先做了迴圈解碼,再做歸一化處理。
迴圈解碼是需要的,但是歸一化處理不一樣。
安全性不論,每條資料先要跑正則再送檢,這個效率要比傳統的正則匹配法低一些。
那麼,讓我在巨人的肩膀上,再做一些小改進。
理論
對於通過CNN來做NLP處理的論文,國內外都可以找到很多。
大致的原理是這樣:
句子->詞向量->卷積層->池化層->連結層
簡單的說,就是把句子內的詞轉化為詞向量,後面接單層的CNN。
訓練資料
首先,我們需要訓練集,對照集,檢測集 這個可以用github的一些資料。這裡,就使用前一文中提到的資料集來檢測。
首先,迴圈讀取每一條資料,對每條資料迴圈解碼,打上標籤,最後存檔。
這裡的UrlDecode()完成迴圈解碼的功能。
for each_line in sql_file: str=UrlDecode(each_line) f.writelines('sql' + '\t' + str + '\n') count += 1 print("sql end at %d" % count)
對於訓練集的第一條資料
1%29%20AND%205628%3D4794
經過改寫後,變成這樣
sql1)and5628=4794
全部改寫完成後,就可以用之前提到的模型訓練了
整個訓練在6次迭代後完成。 這個是tensorboard的損失影象。
最後使用test集,可以達到99%以上的檢測率。
混淆矩陣也很好看。
檢測
之前說過,我們需要讓這個模型能應用於實際的生產中。
那麼,結合Tensorflow的C庫,來寫一個檢測程式。
關於Tensorflow C庫的使用,有很多現有的例子,就不多寫了。
大致的流程是這樣
int main(int argc, char* argv[]) { if (argc < 2) return 1; // pre load tf_model_t* model = LoadTFModel("./tf_model.pb"); FillTensor(argv[1]); printf("Model Returns: %d\n", RunTFModel(model)); FreeTFModel(model); return 0; }
這樣,就完成了使用C來檢測注入的目標。
如果是需要重複的使用,可以在系統啟動時呼叫LoadTFModel(),檢測時只需呼叫FillTensor()和RunTFModel()即可。
可以省略掉載入的時間。
不用時呼叫FreeTFModel()清空資源。
如果需要看下單次處理的速度之類。
在FillTensor()和RunTFModel()之間加個迴圈,前後記錄時間,轉double除一下就可以。
我在i7-2700上跑了50萬次,平均不到100微秒。
大致1秒1萬-2萬多次的樣子。
有時間調調參,或者使用GPU的話應該會更高。
結語
擼貓擼貓