基于svm算法的简单XSS攻击识别模型

 Stardustsky   2017-04-01 13:59   1257 人阅读  0 条评论

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

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

说一下分类原理,比如:

201704011491027089309828.png

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

2.png

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

3.png

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

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

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

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

4.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,这样让机器在训练过程中知道自己的对错。
攻击样本:

5.png

正常样本:

6.png

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

7.png

恶意样本标签:xss_lable

8.png

正常样本阵列safe_list

9.png

正常样本标签:safe_lable

10.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进行预测:

11.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成,利用训练集训练完成的模型对样本集进行预测

12.png

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

http://www.stardustsky.net/svm/svm.php

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

本文地址:http://www.stardustsky.net/index.php/post/47.html
版权声明:本文为原创文章,版权归 Stardustsky 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?