xss检测
xss检测
怎么说好呢 主要是需求驱动吧 要多多学习啊
source
start
从哪里入手好呢 其实国内没几个人公开自己的研究 找到的资料相当匮乏 但这也表明了机会 这边还没那么卷
首先 完善一下 这个 NLP系列之run哥带你手撕Word2Vec
完善了 这个以后 就去 看看webber师傅的文章
首先入门的话 现从kaggle上的数据集开始做吧
NLP肯定要先考虑分词
ok 来看看数据集长什么样子
分词&泛化
扫了一眼发现xss数据集有这些特征 (怎么感觉alert筛一遍就差不多了 嘻嘻嘻
仔细想一下 平时xss测试中都有哪些特征
不过是 alert()
http://hook地址
<script>
等恶意标签最常见
所以分词要怎么考虑呢
分词的技巧
为什么要分词?
- 将复杂问题转化为数学问题。而 NLP 也是相同的思路,文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,而分词就是转化的第一步。
- 词是一个比较合适的粒度。词是表达完整含义的最小单位。字的粒度太小,无法表达完整含义,比如”树“可以是”大树“,也可以是”茂凯“。而句子的粒度太大,承载的信息量多,很难复用。比如”传统方法要分词,一个重要原因是传统方法对远距离依赖的建模能力较弱。”
所以我们回到现在的数据集 我们想要把 alert() <script>
这种给他提出来 这样的话 我们就可以把它们当做特征
大佬的分词方式
- 单双引号包含的内容 ‘xss’
- http/https链接
- <>标签 < script>
- <>开头 < h1
- 参数名 topic=
- 函数体 alert(
- 字符数字组成的单词 另外,为了减小分词数量,需要把数字和超链接范化,将数字替换为”0”,超链接替换为http://u。 实现的代码如下:
1 | def GeneSeg(payload): |
ok 然后我们之后就要把这些玩意给变成 one-hot 形式 NLP系列之run哥带你手撕Word2Vec 讲的很清楚了
这里为了方便 我们选择直接导包
https://radimrehurek.com/gensim/models/word2vec.html
小学一手 作者是选择了
取正样例中出现次数最多的3000个词,构成词汇表,其他的词标记为“UKN”
后来我觉得还是10~20次比较合适
用法
1 | model = Word2Vec(sentences=common_texts, vector_size=100, window=5, min_count=1, workers=4) |
之后就是扔到NN里跑咯
我们想判断这玩意是不是xss 还有一步
词向量到训练
大致就是 把词向量看成特征 –》分类问题
最终根据分词可以得到一个词向量序列 然后就可以直接上机器学习了
https://link.springer.com/chapter/10.1007/978-981-33-6987-0_27
数据集
https://github.com/fmereani/Cross-Site-Scripting-XSS
https://github.com/fawaz2015/XSS-dataset
总结一下NLP的一些方法
传统的方法有哪些?
- 词袋模型(Bag of words)、tf-idf
使用这两种特征表示方法,都有非常大的问题:特征稀疏以及不含语序。
n-grams
能在一定程度上捕捉词的语序
词向量
GloVe、(矩阵分解方法),谷歌的word2vec和facebook的fasttext(神经网络方法)
TextCNN
使用了横跨词向量宽度的卷积核,并使用不同大小的卷积核捕捉不同范围的特征
本实验总结
分词 + 泛化
word2vec 转化为词向量,对词向量进行填充和截断
训练TextCNN模型:将填充和截断后的词向量作为输入,将训练数据的标签作为输出