xss检测

xss检测

怎么说好呢 主要是需求驱动吧 要多多学习啊

source

webber师傅的文章

https://www.secpulse.com/archives/74179.html

start

从哪里入手好呢 其实国内没几个人公开自己的研究 找到的资料相当匮乏 但这也表明了机会 这边还没那么卷

首先 完善一下 这个 NLP系列之run哥带你手撕Word2Vec

完善了 这个以后 就去 看看webber师傅的文章

首先入门的话 现从kaggle上的数据集开始做吧

NLP肯定要先考虑分词

ok 来看看数据集长什么样子

分词&泛化

扫了一眼发现xss数据集有这些特征 (怎么感觉alert筛一遍就差不多了 嘻嘻嘻

仔细想一下 平时xss测试中都有哪些特征

不过是 alert() http://hook地址 <script>等恶意标签最常见

所以分词要怎么考虑呢

分词的技巧

参考资料

为什么要分词?

  1. 将复杂问题转化为数学问题。而 NLP 也是相同的思路,文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」,结构化数据就可以转化为数学问题了,而分词就是转化的第一步。
  2. 词是一个比较合适的粒度。词是表达完整含义的最小单位。字的粒度太小,无法表达完整含义,比如”树“可以是”大树“,也可以是”茂凯“。而句子的粒度太大,承载的信息量多,很难复用。比如”传统方法要分词,一个重要原因是传统方法对远距离依赖的建模能力较弱。”

所以我们回到现在的数据集 我们想要把 alert() <script> 这种给他提出来 这样的话 我们就可以把它们当做特征

大佬的分词方式

  • 单双引号包含的内容 ‘xss’
  • http/https链接
  • <>标签 < script>
  • <>开头 < h1
  • 参数名 topic=
  • 函数体 alert(
  • 字符数字组成的单词  另外,为了减小分词数量,需要把数字和超链接范化,将数字替换为”0”,超链接替换为http://u。  实现的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def GeneSeg(payload):
payload=payload.lower()
payload=unquote(unquote(payload))
payload,num=re.subn(r'\d+',"0",payload)
payload,num=re.subn(r'(http|https)://[a-zA-Z0-9\.@&/#!#\?]+', "http://u", payload)
r = '''
(?x)[\w\.]+?\(
|\)
|"\w+?"
|'\w+?'
|http://\w
|</\w+>
|<\w+>
|<\w+
|\w+=
|>
|[\w\.]+
'''
return nltk.regexp_tokenize(payload, r)

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://www.kaggle.com/datasets/syedsaqlainhussain/cross-site-scripting-xss-dataset-for-deep-learning

https://github.com/fawaz2015/XSS-dataset

总结一下NLP的一些方法

传统的方法有哪些?

  • 词袋模型(Bag of words)、tf-idf

​ 使用这两种特征表示方法,都有非常大的问题:特征稀疏以及不含语序。

  • n-grams

    能在一定程度上捕捉词的语序

  • 词向量

    GloVe、(矩阵分解方法),谷歌的word2vec和facebook的fasttext(神经网络方法)

  • TextCNN

    使用了横跨词向量宽度的卷积核,并使用不同大小的卷积核捕捉不同范围的特征

本实验总结

  1. 分词 + 泛化

  2. word2vec 转化为词向量,对词向量进行填充和截断

  3. 训练TextCNN模型:将填充和截断后的词向量作为输入,将训练数据的标签作为输出