基于CNN的JSP类型Webshell检测

2022-01-07 03:31巩思越张英韬王宝会
新型工业化 2021年10期
关键词:灰度分类样本

巩思越,张英韬,王宝会

(1.北京航空航天大学软件学院,北京 100000;2.武汉大学,湖北 武汉 430000)

0 引言

随着我国互联网应用的突飞猛进,Web应用在众多场景和业务中变得越来越重要,这也给不法分子提供了数不胜数的Web漏洞靶场。作为一种常用的攻击工具,Webshell是以asp、php、JSP等常见的网页文件形式存在的一种代码执行环境,也被叫做网页后门。攻击者通过层出不穷的Web漏洞进入到后台管理系统后,通常会将php或者JSP后门文件与网站服务器Web目录下正常的网页文件混在一起,然后就可以使用浏览器来访问Webshell,从而进行文件上传下载或者进一步的权限提升。根据2020年我国互联网网络安全态势综述[2]报告显示,监测发现境内外约2.6万个IP地址对我国境内约5.3万个网站植入后门,根据INTERNET LIVE STATS[3]统计数据显示,2021年6月,平均每天会有19万个网站受到不同程度的网络攻击,在所有的网络攻击中,后门植入(也称Webshell攻击、木马攻击)无疑是影响最大,最深远的。Webshell植入可以让攻击者长时间的控制服务器且不被发觉,可以不断地从服务器中获取数据并且对其进行操控,这对于网站拥有者和网站用户来讲都是不可接受的。目前容易受到Webshell攻击的对象都是一些较为老旧的、使用PHP及JSP编写的网站,而现阶段各家云服务厂商、安全厂商对于这些攻击的检测效果差强人意,一旦被攻击损失惨重,并且绝大多数研究针对的都是PHP类型的Webshell攻击进行研究,针对JSP类型的Webshell检测研究远远低于针对PHP类型的Webshell研究[8]。故本文希望能够提出一种深度学习算法,针对JSP类型的 Webshell文本进行检测,提升整体的检出精度,从而能够更好的应用在各个JSP web项目中,有效的保护JSP类型的Web项目,降低项目受到攻击的概率,提高系统的安全程度。

1 相关研究

JSP类型的Webshell检测,主要分为三类,分别是基于流量检测、基于日志检测和基于文本检测。本文主要研究对JSP类型的Webshell基于文本分类的检测。基于文本分类的检测实际上是对一份代码文件进行判断,属于文本二分类问题,优势在于发现及时、特征分析方便。目前比较主流的方式有三种:(1)基于特征匹配的方式进行检测,Ben Hagen于2011年设计实现了Neo PI[10]检测器,用于对文件恶意性进行定量检测。该工具对文本的最长字符长度、信息熵、重合指数、已知恶意代码字符串以及文件压缩比等元素分析待测文件,但是该工具只对文件做定量结论,而不做定性评价。Luczko又设计了一款PHP shell detector[11],该工具是利用文件的MD5值来识别恶意文件,但是,MD5值的HASH特性,会导致漏报率比较高。基于文本特征的检测,检测效果优劣主要依赖于特征库的质量,不同类型的Webshell各有特点,需要根据目标针对性构建特征库,人工工作量很大,通用性不足。此外,由于特征库是针对已有的Webshell构建的,因此新Webshell检测效果也有限。(2)基于机器学习的检测,茅雨绮等人提出的基于抽象语法树和XGBoost的JSP Webshell检测[6],提取出Java文件的语法树,抽象出特征序列,以特征序列作为输入样本进行检测。词向量提取中,茅雨绮等人对比了三种不同的特征提取算法,分别是TF-IDF,Word2Vec,Glove,机器学习算法选择对比了XGBoost、KNN、支持向量机、随机森林四种机器学习算法,最终得出结论Glove+XGBoost的组合可以得到更好的效果。(3)基于深度学习的检测,周子恒等人在提取了PHP文件的操作码之后,使用word2vec转换词向量,利用RNNs-LSTM算法对PHP样本进行分类,准确率达到了95%[10]。傅建明等人是基于提取了PHP文件操作码之后,使用词汇表模型对文件进行表示,然后使用卷积神经网络对Webshell文件进行分类,F1值达到了97.2%[12]。

3 本文方法

根据前人研究经验,大部分学术论文选择研究PHP类型的Webshell检测,主要是由于以下两点,一是特征提取便捷,可以通过现成的库提取opcode,转而作为深度学习的特征进行输入,二是网络上公开的PHP Webshell较多,可以有效的进行计算。但是在样本集不变,特征提取手段不变的前提下,大部分的论文的实验结果都是在95%上下,可是无法应用到实际场景中。本文采用了将文本转化为灰度图像,使用图像检测CNN方法,进行判断,具体流程如图1。

图1 研究过程

3.1 评价标准

由于Webshell的检测与传统的分类问题不太一样,更加在意Webshell的破坏威力,所以希望是在尽可能提高查全率的同时降低误报率,我们采用混淆矩阵的方式来展示最终的结果,并对恶意样本的查准率和查全率进行比较。

表1 混淆矩阵

3.2 数据获取

针对JSP类型的Webshell文件网络公开数据较少的情况,我们收集了网络上公开的Webshell仓库,从中提取了400多个JSP类型的Webshell文件,再由东巽科技(北京)有限公司提供了2233个恶意JSP样本,经过去重后,得到2413个异常样本数据,正常样本的收集是获取了gitee.com上使用“JSP”作为关键词搜索仓库的前100页所有仓库中除恶意样本外的所有JSP文件。去重过后得到3360个正常样本。

JSP类型的Webshell样本操作码没有公开库可以提取,所以自然也就不能按照PHPWebshell的检测方式进行检测,我们尝试了几种实现方式,最终选择了使用灰度图表示文件的形式进行处理。传统的文本文件处理始终是围绕着词的维度作为特征进行输入,十分依赖词的拆分或是token的提取与表示,从之前的tfidf,word2vec到后来的Bert、GPT3,围绕着词的维度在对文本进行处理,但是考虑到Webshell检测这个任务属于一个二分类任务,更多的是偏向判定是或不是这个问题,就和最开始的图像识别问题很相似。图像识别也可以是对一个图像进行判断,属不属于这个类别的问题,极其相似的任务目标下,我们应该做的就是找出文本的特征。

3.3 预处理转换为灰度图像

对于JSP类型的Webshell而言,特征其实就是它导入的包和对这些包进行操作的语句,传统的检测方式可以是对关键函数进行特征编码,作为深度学习网络的输入,如PHP中的eval、system、cmd_shell、readdirl函数,如果套用到JSP类型中就是对Java语句中java.io.FileOutputStream、application.getRealPath等语句。但实际上,每一个操作函数单独作为一个特征可以,也可以被多个特征组合起来共同标记,如eval,我们认为eval是由四个字母组成,当这四个字母按照相同顺序、相邻的出现在同一行的时候,也可以认为这个特征是成立的。基于这个想法,我们希望能够尝试着将这种特征刻画并提取出来。

在获取到数据集并进行去重过后,我们需要对样本进行预处理,我们将JSP文件通过tomcat服务器提供的接口转换为Java文件进行对比试验。考虑到代码编写,所以我们去除了注释和中文字符,这里我们默认中文字符不会参与到Java代码中,只会出现在JSP的HTML结构中。然后对剩余所有的字符通过python的ord函数转换为对应的ASCII值。这个时候一个文本就可以由大量的0到128表示了。通过对拥有样本的分析可以发现,正常样本的行数远远小于异常样本的行数,即恶意样本有可能会充斥大量无关字符进行干扰判断,且异常样本中可能包含类似“u006fu0075u0074”这种字符,实际上是将JSP文件中的Java代码部分做了unicode编码,通过混淆编码的方式绕过传统的Webshell检测机制。我们选择保留了这部分代码,并没有选择转码回去,这样的话,后续如果有这样的异常样本出现,特征也会更加明显。

JSP/Java文件转码完成后,我们对不满一百个字符的行末尾补0,按行区分,构建出一个1000*100的灰度图像,文件多余的部分截掉,行数不足的补0。生成的图像中每一个像素点都是之前文件的一个字母或标点。如图2所示,第一行的图像是异常样本的灰度图像,第二行是正常样本的灰度图像。图3表示截取了生成图像的前100行像素。

图2 异常样本与正常样本生成灰度图像对比图

3.4 构建CNN模型

考虑到实际收集到的样本数量较少,对于大型的网络结构偏差会比较大,所以对于这种图像处理的方式采用的是较为简单的CNN网络结构。网络结构如下,先通过3*3*1的卷积网络,然后通过一个2×2的最大池化层,重复三次,接着将经过池化的向量拉成一维向量,通过隐层维度分别为256,128,64的全连接层,汇总到一个维度中,除了输出层使用的是sigmoid激活函数外,其余各层激活函数选择的都是ReLU。实际网络结构如图4。

图3 截取异常样本与正常样本生成灰度图像对比图

图4 网络结构

我们的对JAVA和JSP两种类型的文件分别进行训练,将原始样本以4:1的比例拆分为训练集和测试集进行训练,训练20个epoch,batch大小选择10,优化器选择Adam,参数设定为:learning_rate=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-07,从第13个epoch开始,训练集的分类准确率就已经达到了1,这也符合我们的预期,因为Webshell检测需要能够对已知的样本进行完全正确的分类。共计训练20个epoch之后,JSP类型的测试结果如表一所示,Java类型文件测试结果如表2所示。关于两种类型测试集总和数量差了100多个样本的原因是,在tomcat将JSP转码为Java文件的过程中,有少量JSP样本由于语法错误无法转码成功,但是在JSP类型训练中还保留了下来,目的是为了提取其中的公共特征。

表2 JSP 类型CNN 测试集结果混淆矩阵

表3 JAVA 类型测试集结果混淆矩阵

4 结果对比与分析

本文在使用相较于其他研究较多的样本后,得到的结果相比较而言也是较优的,对比茅雨绮等人与赵瑞杰等人的研究结果如表4,可以看到,由于在训练过程中使得训练集上分类准确度达到1,故在测试集上查全率是远高于前人研究结果的。

表4 对比前人结果与本文结果(JSP 类型)

5 结语

本文提出了一种基于基于CNN的JSP类型Webshell检测方法,以JSP和JSP编译生成的Java文件的ASCII码为原始数据,转换为1000*100的灰度图像,对比CNN、随机森林、XGBoost等主流的深度学习算法,得出ASCII+CNN模型在JSP类型的Webshell检测中明显占优,查全率相较于其他算法都有明显的提升,查准率同样也是在第一梯队的。在接下来的研究中,需要继续收集原始Webshell样本,并尝试新的图像检测处理框架及自然语言处理算法,进一步提升算法的适用性及鲁棒性。

猜你喜欢
灰度分类样本
采用改进导重法的拓扑结构灰度单元过滤技术
分类算一算
用样本估计总体复习点拨
分类讨论求坐标
推动医改的“直销样本”
数据分析中的分类讨论
教你一招:数的分类
基于最大加权投影求解的彩色图像灰度化对比度保留算法
随机微分方程的样本Lyapunov二次型估计
基于灰度线性建模的亚像素图像抖动量计算