
# 基于开源URL数据字符串特征的恶意性检测,本科毕业设计
URL异常检测本质上是一个分类问题,将输入的URL经过处理后得到特征,输入到分类其中,分类器输出分类结果,恶意的还是良性的。
在训练集和验证集的基础上训练了多个分类模型,训练集用于训练、验证集用来调整参数。
## 实验数据
已上传至data文件夹,下面简单解释一下,数据主要分为以下几方面:
(1) 用于特征提取的:
从malwaredomains.com等恶意域数据集收集了26251条恶意域URL,用来提取出现频率较高的恶意词,作为后续的数据特征。
从Alexa获取了世界排名前500的网站,提取出现过的网站名称,用来统计数据集中的URL出现流行网站名次数。
(2) 训练集、验证集、测试集:
从kdnuggets上收集到了带标签(good/bad)的URL数据集,共416350条,用作分类器进行监督学习的训练数据,其中异常数据(bad)71556条,占比17.19%;正常数据(good)344794条,占比82.81%。
将全体数据划分为训练集(70%),验证集(15%)和测试集(15%),并且在每个中均保持异常数据所占比例相同。
(3) 引入外部数据:
从PhishTank上获取了截止到2018年4月9日的36380条钓鱼网站数据集,作为外部新数据引入,用来测试分类器面临新的、未见过的数据集时的分类效果。
## 特征提取
### 数据预处理
首先,鉴于只有小部分URL的前缀有“http”,“https”以及“www”字段,并且这些字符对于恶意性检测并没有帮助,所以在预处理阶段我们将这些前缀删去。
但是要注意将前缀部分与其他部分出现的“http”等字段进行区分,如:“zylights.com/img/?us.battle.net/login/en/?ref=http%3A%2F%2Fkhcdcofus.battle.net%2Fd3%2Fen%2Findex&app=com-d3”中的“http”就出现在参数部分。
此外,由于URL的参数字段可能存在恶意代码,所以我们还需要对URL的编码问题进行考虑,以免影响检测的效果,比如参数字段中的“%20”代表的是空格。
### URL结构划分
考虑到黑名单特征和主机特征的获取非常耗时,并且还会存在一定的噪声和缺失值,而基于内容的特征又非常“重量级”,并且在下载网页内容的过程中会给系统带来安全威胁。
因此,我们选择了基于词汇的URL特征,在能够取得较好检测效果的同时又可以保证“轻量级”和高安全性。为此,我们需要对URL进行深入的了解,URL的结构样例。
```
例如:
1.协议部分:“http:”,在Internet中有多种网络协议例如:http:, https:, ftp: 等。后面的“//“为分隔符
2.域名部分:“www.aspxfans.com”是url的域名部分,在Url中也可以使用ip地址作为域名使用
3.端口部分:跟在域名后面的成为端口,域名和端口之间使用“:”进行分割,端口不是Url的必须部分可以省略
4.虚拟目录部分:从域名后面的第一个"/"开始到最后一个“/‘截止称之为虚拟目录部分,虚拟目录也不是Url的必须部分,本次实例的虚拟目录是”/news/“
5.文件名部分:从域名后的最后一个"/"开始到"?"为止成为文件名部分,如果没有"?"则从域名后的最后一个"/"开始到"#"为止是文件部分,如果没有"?"和”#“,那么从域名后的最后一个"/"开始到结束,都是文件名部分,本例的文件名部分是”index.asp“。文件名部分也不是URl的必须部分,如果省略该部分则使用默认的文件名
6.锚部分:从”#“开始到最后,都是锚部分,本例中的锚部分是”name“,锚部分也不是一个url的必须部分。
7.参数部分:从"?"开始到"#"为止之间的部分成为参数部分,又称搜索部分,查询部分本例中的”boardID=5&ID=24618&page=1“称为参数部分参数部分允许有多个参数,参数与参数之间用"&"作为分隔符。
[URL结构讲解内容参考链接:https://www.jianshu.com/p/b35a94bafb96]
```
### 提取内容列表
由于协议部分对恶意URL的检测没有明显帮助,所以我们不考虑提取这部分作为特征。
在提取特征时,一条URL可以被分成域名、路径、查询参数、锚点四大部分,每个部分又分别是由数字、字母以及特殊符号构成的,我们可以根据特殊字符(例如“/”,“.”,“?”,“=”等)将URL切分为不同的token。这样,我们就可以将一条URL看作是由一组token组成的向量,从而获取到更加具体的特征。
针对URL整体以及它的每个部分,我们一共提取了85个特征,分为基于URL整体的特征、基于域名的特征、基于路径的特征、基于查询参数的特征以及基于锚点的特征。
其中的“恶意词出现次数”特征所统计的恶意词是根据malwaredomains.com下载的恶意域数据集(和训练集、验证集、测试集没有交集)统计出现次数较多的词。
Python自带的包可以根据恶意词的统计结果生成的词云图片(代码位于bad_urls.py),其中字体较大的数据出现频率更高。可以看出,“beget”“service”, “account”, “eby”, “paypal”, “login”, “confirm”这类词出现的频率很高,因为恶意网站经常模仿良性网站或者用一些有吸引力的词语,试图诱导用户输入账号以及登陆信息。
流行网站名是根据Alexa排名前500名的网站数据集进行统计得到的,有些恶意网站会通过模仿知名网站来迷惑用户。根据流行网站中出现的词,我们生成了词云后发现,流行词与恶意词存在着部分交集,比如“apple”、“google”、“facebook”这些词,因为恶意网站有时会假冒流行网站,选取相近的域名来迷惑用户。
所提取的全部特征见下表:
| 基于整体URL的特征 | 基于hostname的特征 | 基于path的特征 | 基于search的特征 | 基于hash的特征 |
| -------------------------------- | ------------------ | ------------------ | ---------------- | -------------- |
| URL长度 | token个数 | token个数 | token个数 | token个数 |
| 字母比例 | 特殊字符个数 | path长度 | search长度 | |
| 数字比例 | 字母比例 | 目录深度(/) | 参数个数(&) | |
| 特殊符号的种类个数 | 数字比例 | 最长token | 方差 | |
| 特殊字符个数 | 出现点的次数(.) | 特殊符号的种类个数 | | |
| URL深度(/) | 是否是IP地址 | 方差 | | |
| 出现点的次数(.) | 熵 | | | |
| [存在@符号](mailto:存在@符号) | token方差 | | | |
| 顶级域名TLD | hostname长度 | | | |
| 出现恶意词的次数 | 字母出现次数 | | | |
| 出现流行网站名的次数 | | | | |
| 出现.php或者.exe的次数 | | | | |