学习机器学习已经有段时间了,心里一直在寻思着如何将其运用在安全上,前几天刚好看到兜哥的那篇文章,于是花了两天时间实现了一个简单的基于svm的xss过滤器,这里做一个比较接地气的分享。

1.概念理解

首先还是科普一些基础概念,什么是SVM,SVM叫支持向量机,是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力。简单来说,就是一个机器学习算法,有什么用呢?我可以通过一些xss语句样本总结规律,从而分辨正常语句和攻击语句,有点类似人的学习行为。

说一下分类原理,比如:

clipboard.png

这样一幅图,攻击语句和正常语句可以使用简单y=wx+b这样的线性公式分类出来,横纵坐标就代表我们选取的维度。
但如果工具语句和正常语句的特征没有那么明显的区分,混在一起呢

clipboard.png

这样的话分割公式就会变得非常怪异,或许单条公式还无法满足需求,而这仅仅是二维上的,如果是三维的呢?

clipboard.png

最后得到的东西可能就是这个样子,如果再加更多的维度,那就不太好想象了。
这个得出这些奇怪图形的过程就叫拟合,而最终形成的样子就是我们的模型,这个模型可能由几百上千个公式构成,SVM就是这么一套帮助我们建模的算法。

2.向量化过程

对于xss,我们人能理解各个标签的含义,各种语意组合,但是机器并不能,所以接下来就是对xss的特征进行向量化,先以一个攻击语句为例:

http://www.baidu.com/index.php?id="; javascript:window.open('data:text/html;base64,PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=='); "

该语句拥有xss中的很多特征,比如javascript、括号、单双引号等,当然这样仅仅三个维度还太少了,我选取了10个xss常见的关键字符作为维度

clipboard.png

可以看到我使用了count函数,为什么要用count呢,就是为了统计一个url中这些关键词出现的个数,然后形成一个10维矩阵
比如一个攻击payload:

http://www.baidu.com/index.php?id=1’”<script>alert(1)</script>

形成的矩阵结果就是

[2,0,0,2,2,1,1,0,1,1]

这个过程就叫做向量化,为什么要这样做呢?这正是因为计算机无法识别直接对如script这样的字符进行处理,我们向量化之后它识别起来就容易得多。

3.训练过程

接下来就是一个训练过程,我们需要为计算机提供两个样本,一个样本全是xss攻击语句,一个则是正常语句,并为这些样本里的url做好标记,比如我标记xss攻击样本里的url特征全部为1,正常样本里的url特征全部为0,这样让机器在训练过程中知道自己的对错。
攻击样本:

clipboard.png

正常样本:

clipboard.png

这些url经过向量化之后可能会形成一个巨大的十维阵列
恶意样本阵列 xss_list

clipboard.png

恶意样本标签:xss_lable

clipboard.png

正常样本阵列safe_list

clipboard.png

正常样本标签:safe_lable

clipboard.png
将两组样本和标签合并

x=xss_list+safe_list        y=xss_lable+safe_list

最后使用svm poly算法进行拟合

clf=svm.SVC(kernel='poly', degree=2).fit(x, y)

最终拟合得到的这个clf即我们的模型
我们可以使用clf.predict(new_paylaod)来进行预测,此时的clf代表了一个经过多次变形扭曲之后的奇怪的东西。
对攻击payload进行预测:

clipboard.png

4.分析

我们对这个过程进行一个分析,其实最终得到的这个模型就是根据一个url里面关键字的个数进行的统计+分析,但这个分析结果不同于正则的点在于,它可以记住一些相关性,比如

 [2,1,0,0,0,0,1,0,0,2]这样矩阵被判别为了xss攻击,但
 [2,1,0,0,0,0,0,0,0,2]这样的阵列却不会被判别为xss攻击

相比于传统的正则非黑即白的判断多了更多模糊组合的判别能力,而且由于其基于实战样本中提取的矩阵特征组合,其对于未知payload的识别能力也比正则好得多,归纳一下机器学习在xss识别上的好处和不好地方
优势:

  1. 自动拟合形成模型,模糊判断能力强,对未知payload识别能力强

  2. 只要有足够的样本和好的维度,判断精确度可无上限提升

  3. 模型一旦形成,再调用现成模型判别速度极快

劣势:

  1. 依赖样本,需要大量的提纯样本用于训练

  2. 模型一旦形成,难以修改,训练样本越大,单条样本对整体模型的影响越小,发现误报改变模型较为麻烦

这里我为了检测效果,将样本集进行了9:1的拆分,训练集9成,样本集1成,利用训练集训练完成的模型对样本集进行预测

clipboard.png

准确率浮动在百分之九十七到九十八之间,还是算精度很高的模型了,当然可能和我的样本集也有关系,测试地址:

http://www.stardustsky.net/sv...

欢迎来搞,如果bypass请留下你的payload或直接加我交流,谢谢。


Stardustsky
43 声望6 粉丝

web安全攻城狮,机器学习玩家