计算机系统应用教程网站

网站首页 > 技术文章 正文

隐马尔科夫算法识别XSS攻击(以白找黑)

btikc 2024-10-24 09:25:01 技术文章 6 ℃ 0 评论

1.参数建模

样本数据可以根据自己的Nginx系统日志来,也可以在网上搜集,为了降低入门难度,我对数据采取最简单的建模,135507个XSS白样本作为训练,16151个XSS黑样本作为验证。

泛化规则如下:

  • 英文字母全用4表示
  • 数字全用3表示
  • 特殊字符用2表示
  • 其他用1表示

2.数据处理与特征提取

由于采集的数据全部都是GET请求,为了简化,仅仅对数据进行URL解码,之后进行泛化。

3.模型训练

remodel = hmm.GaussianHMM(n_components=N, covariance_type="full", n_iter=100)
remodel.fit(X,X_lens)

4.模型验证

等啊等........

出来的结果也有很多特殊字符,直接过滤掉,

15926 # 得分大于200的数量
16152 # 过滤特殊字符后剩余总量
0.986007924715 #超过98%的准确率

5.完整代码

import sys
import urllib
import urlparse
import re
from hmmlearn import hmm
import numpy as np
from sklearn.externals import joblib
import HTMLParser
import nltk


#状态个数
N=10
#最大似然概率阈值
T=-200
SEN=['<','>',',',':','\'','/',';','"','{','}','(',')']

def etl(str):
    vers=[]
    for i, c in enumerate(str):
        c=c.lower()
        if   ord(c) >= ord('a') and  ord(c) <= ord('z'):
            vers.append([4])
        elif ord(c) >= ord('0') and  ord(c) <= ord('9'):
            vers.append([3])
        elif c in SEN:
            vers.append([2])
        else:
            vers.append([1])
    return np.array(vers)


def main(filename):
    X = [[0]]
    X_lens = [1]
    with open(filename) as f:
        for line in f:
            line=line.strip('\n')
            line=urllib.unquote(line)
            vers = etl(line)
            X=np.concatenate( [X,vers])
            X_lens.append(len(vers))
    remodel = hmm.GaussianHMM(n_components=N, covariance_type="full", n_iter=100)
    remodel.fit(X,X_lens)
    return remodel

def test(remodel,filename,fp):
    with open(filename) as f:
        for line in f:
            line=line.strip('\n')
            line=urllib.unquote(line)
            vers = etl(line)
            pro = remodel.score(vers)
            fp.write("SCORE:(%d) XSS_URL:(%s)\n " % (pro, line))


if __name__ == '__main__':
    fp=open("hmm.txt",'r+')
    remodel=main(sys.argv[1])
    test(remodel,sys.argv[2],fp)
    fp.close()


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表