url security with lstm

2018年12月19日 0 条评论 38 次阅读 0 人点赞

一、前言

1.LSTM的基本概念与内部结构

现在常用的memory是LSTM(Long Short-Term Memory), 结构比较复杂,有三个Gate.当外界想写入memory cell的时候,必须通过input gate,只有在input gate被打开的时候,memory gate才可以被写入,input gate 是打开还是关闭,是neural network自己学的。同理还有一个output gate, 它的开或关也是neural network 学到的。还有一个forget gate, 决定什么时候将memory cell中的内容忘掉,它的开或关也是neural network 学到的。可以将LSTM看做special neuron(4 inputs, 1 output), 4 inputs指的是外界想要存到memory cell 里的值+控制三个门的信号。

 

顺便一提,Long Short-term Memory 里的Long 是形容Short-term Memory 的。在最开始看到的最简单的RNN模型中,memory是short-term的,每次有新的输入,memory都会被洗掉。而LSTM的short-term比较long: 只要控制forget gate的信号决定不forget,memory的值就会被存起来。

2.  深度学习在安全领域也开始崭露头角走向了实际应用。LSTM偏好于文本分类问题,故使用此算法检测XSS攻击。

二、数据集

安全领域的公开数据集非常的稀缺,本文提供的数据包含两个部分:xss黑样本有4万多条;另外提供约20万条正常的http get请求记录作为负样例,为了保证数据安全,去除了url中的host、path等信息,仅保留了payload的部分。

之后考虑用github 上的payload作为测试,亦或据实际效果加入训练。地址如下 : https://github.com/foospidy/payloads

  • 正样例:

topic=http://gmwgroup.harvard.edu/techniques/index.php?topic=< script>alert(document.cookie)

siteID=';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";

alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//-->">'>< SCRIPT>alert(String.fromCharCode(88,83,83))

js='"-->< script>alert(/meeh infected/)< marquee>< h1>XSS :)< marquee>< strong>< blink>XSS TEST< h1>XSS :)

  • 负样例:

_=1498584888937/&list=FU1804,FU0,FU1707,FU1708,FU1709,FU1710,FU1711,FU1712

hid=sgpy-windows-generic-device-id&v=8.4.0.1062&brand=1&platform=6&ifbak=0&ifmobile=0&ifauto=1&type=1&filename=sgim_privilege.zip

iid=11491672248&device_id=34942737887&ac=wifi&channel=huawei&aid=13&app_name=news_article& version_code=621

version_name=6.2.1&device_platform=android&ssmix=a&device_type=FDR- A03L&device_brand=HUAWEI&language=zh&os_api=22

os_version=5.1.1&uuid=860947033207318& openudid=fc19d05187ebeb0&manifest_version_code=621&resolution=1200*1848&dpi=240

update_version_code=6214&_rticket=1498580286466

三、分词

文本预处理过程如下:

使用文本分类的方法自然涉及到如何将文本分词。观察样例,人是如何辨别XSS的:参数内包含完整可执行的HTML标签和DOM方法。所以要支持的分词原则为

单双引号包含的内容 ‘ ’

http/https链接

<>标签 < script>

<>开头 < h1

参数名 topic=

函数体 alert(

字符数字组成的单词  另外,为了减小分词数量,需要把数字和超链接范化,将数字替换为”0”,超链接替换为http://u。

样例如下:

['topic=', 'http://u', '< script>', 'alert(', 'document.cookie', ')', '']

['siteid=', 'alert(', 'string.fromcharcode(', '0', '0', '0', ')', ')', 'alert(', 'string.fromcharcode(', '0', '0', '0', ')', ')', 'alert(', 'string.fromcharcode(', '0', '0', '0', ')', ')', 'alert(', 'string.fromcharcode(', '0', '0', '0', ')', ')', '>', '', '>', '>', '< script>', 'alert(', 'string.fromcharcode(', '0', '0', '0', ')', ')', '']

['js=', '>', '', '', '< script>', 'alert(', 'meeh', 'infected', ')', '', '', '< marquee>', '< h0>', 'xss', ')', '', '< marquee>', '< strong>', '< blink>', 'xss', 'test', '', '', '', '< h0', '>', 'xss', ')', '', '']

四、嵌入式词向量

如何将分词后的文本转化为机器学习的问题,第一步是要找到一种方法把这些词数学化。常见的方法有TF-IDF/Word2Vec/CountVectorizer

项目前期考虑了word2vec-lstm构架,实际过程中并未表现出word2v的优势。故采用keras自带的预处理工具Tokenizer,

核心代码:



五、模型

最终使用的模型结构如下:


六、总结

使用lstm建立url识别模型,算法在本身的数据集上有较好的效果。对样本有较高的识别率,但对于正常样本存在一定的误判。即以损失准确率为代价得到了召回率的提高。

展望:

1.采用payload数据集多方面测试模型效果,分析测试情况,引入新的训练数据。

2.对于正常样本误判问题的处理:

考虑训练集分布,提高训练集正常样本数量。

正常样本存在数量多、特征冗余等问题,采用word2vec引入语义能较好地解决此问题。但url中字符较多,分词难度大,并不偏好与词向量。需平衡此问题才能使模型有更好的泛化能力。

 

lyssom

这个人太懒什么东西都没留下

文章评论(0)