前言
我们介绍了HMM的基本原理以及常见的基于参数的异常检测实现,这次我们换个思路,把机器当一个刚入行的白帽子,我们训练他学会XSS的攻击语法,然后再让机器从访问日志中寻找符合攻击语法的疑似攻击日志。
通过词法分割,可以把攻击载荷序列化成观察序列,举例如下:
词集/词袋模型
词集和词袋模型是机器学习中非常常用的一个数据处理模型,它们用于特征化字符串型数据。一般思路是将样本分词后,统计每个词的频率,即词频,根据需要选择全部或者部分词作为哈希表键值,并依次对该哈希表编号,这样就可以使用该哈希表对字符串进行编码。
本章使用词集模型即可。
假设存在如下数据集合:
首先生成词汇表:
根据词汇表生成词集:
简化后的词集模型的核心代码如下:
数据处理与特征提取
常见的XSS攻击载荷列举如下:
需要支持的词法切分原则为:
单双引号包含的内容 ‘XSS’
http/https链接 http://xi.baidu.com/xss.js
<>标签 <script>
<>标签开头 <BODY
属性标签 ONLOAD=
<>标签结尾 >
函数体 “javascript:alert(‘XSS’);”
字符数字标量 代码实现举例如下:
另外,为了减少向量空间,需要把数字和字符以及超链接范化,具体原则为:
结合词集模型,完整的流程举例如下:
训练模型
将范化后的向量X以及对应的长度矩阵X_lens输入即可,需要X_lens的原因是参数样本的长度可能不一致,所以需要单独输入。
验证模型
整个系统运行过程如下:
验证阶段利用训练出来的HMM模型,输入观察序列获取概率,从而判断观察序列的合法性,训练样本是1000条典型的XSS攻击日志,通过分词、计算词集,提炼出200个特征,全部样本就用这200个特征进行编码并序列化,使用20000条正常日志和20000条XSS攻击识别(类似JSFUCK这类编码的暂时不支持),准确率达到90%以上,其中验证环节的核心代码如下: