摘要:随着互联网的快速发展,Web应用已成为人们日常生活和工作中必不可少的一部分,随之而来的是大量针对Web服务的攻击,在目标服务器上植入Webshell已成为攻击者最常用的手段。通过Webshell,攻击者可以在目标服务器上执行一些命令从而完成信息嗅探、数据窃取或篡改等非法操作,对Web服务器造成巨大危害。最开始研究人员通过从Webshell中提取特征码的方式来检测Webshell,后来为了逃避检测,混淆和加密技术在Webshell中被广泛采用,这极大地增加了Webshell检测的难度,为此许多研究人员开始采用机器学习技术来进行Webshell的检测。从多个角度阐述了Webshell检测技术发展现状、所遇到的问题及今后的研究方向。
内容目录:
3 结 语
随着Web技术的快速发展,Web功能的增强,越来越多的应用选择通过Web为用户提供服务。大量的Web应用在丰富和便利了人们的日常生活和工作的同时也暴露了大量的攻击面,导致大量Web服务器时常遭受攻击。攻击者在攻陷Web服务器后通常会在Web服务器上植入Webshell,并利用它来控制Web服务器。据微软公司的研究报告显示,从2020年8月到2021年1月,平均每月在服务器上遇到此类威胁的
次数为140 000次,几乎是上一年77 000次月均的两倍。Webshell可以为攻击者提供一种伪装成与合法流量混合的通信信道,利用该信道可以实现对失陷网络的持久访问。Webshell恶意软件是一种长期存在的普遍威胁,能够绕过很多安全工具的检测。
网络攻击者一般通过Web应用的自身漏洞或者与其相关的其他失陷主机进行Webshell的部署,Webshell可以作为一个持久性的后门,或者作为一个中继节点将攻击者的命令传递给其他系统。攻击者经常将多个失陷系统上的Webshell串联起来,从而实现跨网络流量的传递。
最开始Webshell都是明文传输的,并且通信流量也都未采取任何保密措施,于是安全研究人员从Webshell或者其通信流量中提取明文特征码,然后通过检测特征码实现对Webshell的检测。随即,为了绕过检测工具,攻击者采用了混淆和加密技术对Webshell进行混淆、加密,或者将Webshell代码嵌入到正常文件中。这对Webshell的检测造成了很大的困扰,如何准确地检测出Webshell,阻止基于Web的攻击已经成为网络安全领域的研究热点。许多研究人员在Webshell检测领域进行了深入研究,并提出了一些卓有成效的方法。这些方法主要集中在文件检测和流量检测两种不同的技术路线上。
本文将从攻击原理和逃逸手段两个方面对Webshell进行介绍,再从文件和通信流量两个方向上介绍现有的Webshell的检测方案,并提出未来可能的技术路线。
1 Webshell 简介
坏等操作。攻击者首先利用服务器的漏洞将具有特定功能的Webshell脚本上传到服务器,然后通过访问该Webshell脚本,在服务器上远程执行命令。
1.1 攻击原理
Webshell的种类有很多,由于不同脚本其自身的语言特性,所实现的Webshell代码结构也有很大的差别。虽然Webshell在代码表现形式上有很大的不同,但它们实现攻击的本质是一样的。本文以PHP Webshell为例。
为了丰富用户体验,现在的Web应用程序都具有交互特性,即同一个页面可以根据用户的需求呈现不同的内容。用户在访问服务器时可以在请求中携带参数,服务器收到请求后解析参数,根据不同参数的含义执行对应的操作,然后再将执行结果返回给用户。一旦Webshell脚本被植入到服务器,攻击者就可以利用Web应用程序的交互特性访问Webshell脚本,Web容器收到请求后会解析请求中的参数,然后调用相应的解释器执行Webshell脚本,并将解析好的参数传递给Webshell脚本。一个PHP Webshell代码如图1所示。
图 1 一句话 PHP Webshell
图1中$_REQUEST[‘password’]可以获取用户Web请求中的password参数值,这是由PHP语言支持的。如果用户在请求中将password参数设置为一段PHP代码,那么这段代码将会通过eval函数被PHP解释器执行。攻击者可以通过这段代码完成诸如系统命令执行、文件操作、数据库操作等任务,以实现信息收集、数据窃取、主页篡改等功能。
eval函数的作用是将参数字符串当作PHP代码去执行,除此以外,在PHP中的system、exec、shell_exec、passthru、proc_open、show_source、parse_ini_file、popen等函数以及动态函数都具有命令或代码执行功能,这是通过Webshell实现攻击的一个重要原因。
可以看到,在整个攻击过程中,参数传递属于正常的超文本传输协议(Hyper Text Transfer Protocol,HTTP)交互,所执行的函数也是编程语言本身的功能,这就给Webshell的检测带来了很大的难度。随着时代和技术的变迁,出现了以下4类常见的Webshell。
(1)通用型Webshell。通用型Webshell的功能比较全,对应的脚本文件也会比较大,它会调用许多系统关键函数,并且通常会对代码进行加密以隐藏自己。
(2)单一型Webshell。单一型Webshell是功能比较单一的Webshell,一般只包含一个功能,常见的Webshell功能包含打包网站源码、导出网站数据库、上传通用型Webshell等。
(3)一句话Webshell。顾名思义,一句话Webshell脚本中只包含一条代码,一般这条代码可以执行任意通过参数传递过来的代码或命令,如图1所示。一句话木马适用场景广泛,既可单独以文件的形式存在于Web目录中,也可嵌入其他文件中。因为只有一行代码,所以暴露出来的特征也会比较少,通过适当变形可以很容易绕过查杀。
(4)内存Webshell。内存Webshell是在内存中写入恶意代码并执行,以达到远程控制Web服务器的目的。内存Webshell利用了一些Web中间件的漏洞执行某些恶意代码,过程中不会有文件落到磁盘中,检测难度比较大。
1.2 逃逸手段
为了避免被查杀,攻击者采用了多种方式对Webshell进行变形或者对通信流量进行加密,常用的方法包括以下6点。
(1)插入注释。在代码段中插入注释信息,注释信息不会影响程序的正常执行,但是对检测工具会造成一定的干扰。
(2)字符串编码/加密。对代码中的一些关键字符串用Base64或其他编码方式进行编码,更有甚者利用约定好的加密方式进行加密,在调用的时候动态地进行解码或者解密。
(3)外形混淆。对代码中的变量名、函数名等标识符用一些无意义的符号进行等价变换,变得让人难以分析、理解。
(4)逻辑混淆。通过插入分支、插入循环等方式变换程序的控制流程,让程序变得难以被分析。
(5)字符串拆分。对于一些关键字符串,可以拆成很多段,用多个不同的参数进行传递,最后在使用的时候再进行拼接。
2 检测方案
尽管有许多方法可以检测Webshell,但检测Webshell依然是比较困难的,因为攻击者可以很容易地利用加密、编码、混淆等方式对Webshell脚本文件和流量进行修改,导致检测方法顾此失彼,所以最为有效的检测方法是构建一个同时使用多种检测方法的纵深防御体系。
在检测Webshell过程中,无法避免将正常文件错误标记为Webshell的情况,当一个潜在的Webshell被检测到之后需要结合其他手段,甚至通过人工的方式去确认Webshell的真实性。
2.1 基于文件的检测
基于文件的检测方法主要从文件操作、文件之间的关系和文件内容这3个方面对文件进行分析,进而发现潜在的Webshell文件。
2.1.1 基于文件操作的检测方法
Webshell文件一般都是由攻击者在攻陷了一个Web服务器后放置在服务器上的Web目录中,它主要通过在Web目录下新增一个文件,或者修改现有的文件来实现。可以用OSSEC、audit、dnotify等工具对Web目录及其子目录下的文件进行监控,一旦发现文件创建或者修改就进行告警,由安全专家进行分析,或者调用其他自动化分析工具对创建或者修改的文件进行分析,从而识别出攻击者上传的Webshell。
基于文件监控的方法可以及时、高效地检测出可疑文件,但这些可疑文件究竟是不是Webshell还需依赖其他分析工具或者人工分析(因为一些正常业务也涉及新文件创建和修改),并且该方案需要在各个服务器上安装相关的文件监控软件,这在一些场景下是不被允许的,总体部署成本较高。
2.1.2 基于文件连接关系的检测方法
一个Web站点通常包含非常多的页面,记住每个页面的地址并在地址栏中输入地址进行访问显然是不现实的,为了方便用户操作,一个页面中往往包含很多指向站点内其他页面的链接,用户通过这些链接就可以访问站点内的几乎所有页面。对于那些通过文件上传植入到Web服务器上的Webshell来说,正常页面中几乎不会有指向Webshell脚本的链接,攻击者都是通过直接访问它的路径去执行特定操作的,所以Webshell脚本通常是一个或几个孤立的页面。基于这一点可以将一个站点看作一个有向图,站点中的每个页面对应图中的每个节点,不同页面间的链接指向关系对应图中的有向边。在这个有向图中,如果一个节点的入度很大,则表明有许多其他节点对应的页面中包含有指向该节点对应页面的链接,它为正常页面的概率也就很大。相反,如果图中一个节点的入度为0(或者很小)或者几个节点组成的强连通子图的入度为0(或者很小),则这些节点对应的页面是异常的概率就很大。
基于上述设想可以基于主动扫描与被动访问相结合的方式将一个站点的页面关系图创建出来,计算图中节点的入度,如果入度为0或者入度相较于其他节点来说小很多,则节点对应的页面有很大概率是异常的。该方案可以通过网页之间的链接关系发现潜在的异常页面,但无法确定这些异常页面是否是Webshell,通常需要借助其他分析工具进行进一步的分析。另外如果站点内的页面很多,创建出来的页面关系图会很大,图的相关算法的效率也会大幅下降。
2.1.3 基于文件内容的检测方法
基于正则表达式的特征码方法是最早被广泛用来进行Webshell检测的一种方法。这种方法需要研究人员对已知的Webshell脚本进行研究,从中提取特征码,做成一个特征库。在检测阶段用待检测文件的内容去匹配特征库,如果匹配到一个特征库,则认为待检测文件是一个Webshell文件。这种方法的特点是操作简单、检测速度快,但是它也有明显的缺点:为了保证检测准确率需要频繁更新特征库,人力耗费比较大,无法检测未知的Webshell,容易被经过混淆和加密的Webshell绕过。
为了解决基于传统检测方法所遇到的问题,机器学习技术被用来进行Webshell文件的检测,实践证明基于机器学习的方法在Webshell中起到了重要作用。其中,与Webshell相关的特征工程在基于机器学习的检测中扮演了重要的角色。与之相关的特征选择主要分为文本特征和语法特征两种类型。
文本特征无须考虑脚本的编程语言特性,仅从字符、单词、标点符号等分布情况去实现Webshell的检测。Behrens等人设计实现了一种基于统计方法的检测工具——NeoPI。该工具试图从最长字符串、信息熵、重合因子3个方面判断一个文件包含混淆代码的可能性。因为正常的脚本文件里面的单词通常都是比较短的,但是经过混淆、编码之后往往会产生很长的单词,识别出这些反常的长单词有助于识别混淆代码。信息熵可以用来度量一段信息的混乱程度,信息熵越大,则信息越混乱。Webshell脚本文件为了绕过常规的检测会对它的一些内容进行加密,加密后的数据往往比较混乱,导致信息熵变大,因此利用信息熵可以识别混淆代码。重合因子是一种在密码分析和自然语言分析中常用的技术,NeoPI只能用来度量一个文本文件或脚本文件经过混淆或者加密的可能性,但是无法用来确定该文件就是Webshell文件,所以仅用它来检测Webshell脚本的效果并不好,其发展重点在于作为一种辅助工具,结合其他检测方法进行检测。
胡必伟等人提出了一种基于贝叶斯理论的Webshell检测模型,首先从文件中提取最长单词长度、压缩率、重合因子等特征进行分析,然后训练一个贝叶斯分类进行Webshell的检测。胡建康等人提出了一种基于决策树的检测模型,从文件中提取出单词数量、文本行数、函数调用模式的数量等特征作为特征向量去训练决策树模型,并用训练好的模型进行检测。该模型虽然在实验数据集上取得了不错的效果,但在实际应用中效果不佳,主要是因为提取的单词数量、文本行数、函数调用模式的数量等特征对于Webshell脚本和正常文件的区分度不大。LYU等人提出了一种利用卷积神经网络检测Webshell的方案,该方案首先利用除英文和阿拉伯数字外的字符作为分隔符对文件进行分词,然后选择Word2vec算法对词进行向量化编码,最后用卷积神经网络训练一个二分类模型。该方案不需要人工提取特征,设想利用深度神经网络强大的学习能力直接从文本文件学习出Webshell脚本文件和其他文件之间的差异。虽然深度学习具有直接从原始数据中提取特征并进行学习的能力,但是这严重依赖于样本的质量和数量,如果有足够多的高质量样本,训练出的模型是可以学习到Webshell脚本和其他文件之间的真正的差异的。在现实中,能获取到的Webshell样本数量是比较少的,并且质量也无法保障,因此训练出来的模型往往是过拟合的,在训练集上表现很好,但在实际应用中表现较差。
Webshell脚本都是符合某种编程语言语法的脚本,将其当作普通文本进行分析会丢失许多有价值的信息。利用语言语法层面的特征进行分析可以更容易地区分Webshell脚本和普通脚本文件。
孟正等人提出了一种从页面属性和页面操作角度基于支持向量机(Support Vector Machine,SVM)分类进行Webshell检测的模型,通过对常见Webshell脚本代码进行分析,从脚本文件中提取出页面长度、代码行数、注释个数、加解密函数调用、system/eval/exec/shell_exec函数调用、系统函数调用、字符操作类函数调用、系统函数调用、文件操作类命令、ftp操作类命令、数据库操作类命令等作为特征向量,然后用SVM算法进行分类。该方案从Webshell执行原理上进行了分析,提取出Webshell脚本执行过程中常用且正常的Web脚本中不常用的一些函数作为特征,可以有效减少数据噪声的干扰,同时也降低了对样本数据量的要求。但是一些经过混淆的脚本几乎无法从中看到上述函数或者命令的身影。为了解决这个问题,Pan等人[9]提出了从PHP代码中提取Opcode序列作为一种重要特征,同时结合信息熵、最长单词长度、数据压缩比、关键函数或黑名单函数的调用情况等静态统计特征构造一个特征矩阵,然后用SVM、卷积神经网络(Convolutional Neural Networks,CNN)等分类模型进行训练,训练好的模型被用来检测Webshell。Opcode是PHP代码执行过程中的一种中间码,PHP源码经过词法分析、语法分析后,再通过PHP的Zen引擎处理后会生成Opcode序列,在生成Opcode序列的过程中其实已经去除了绝大部分的混淆,所以这种方法能有效检测经过混淆的Webshell脚本。但是Opcode目前仅在PHP中相对比较容易获取,其他类型的脚本暂时还无法轻易获取类似PHP Opcode的中间码。
2.2 基于通信流量的检测
由于所要完成的功能不同,攻击者访问Webshell脚本所产生的流量和正常Web页面请求所产生的流量模式是不同的,基于通信流量的检测就是通过对流量进行分析发现不同寻常的流量。基于流量的检测是基于文件检测的一个重要补充,在某些场景下获取文件并对其进行检测是困难的,并且还有一些Webshell是基于内存的,无法通过文件的方式进行检测,这时基于流量的检测就成为最重要的检测方式。
2.2.1 流量内容
Tian等人提出了一种利用卷积神经网络对流量内容进行分析的Webshell检测模型,该方案首先对http请求内容进行分词,并用word2vec算法进行向量化表示,然后基于“长截短补”的原则将http请求表示成为固定大小的矩阵,最后训练出一个卷积神经网络模型进行Webshell检测。虽然该模型在实验中取得了不错的效果,但是因训练样本不足导致的过拟合问题依旧存在,并且该模型无法处理经过加密的流量。为了绕过安全检测设备的检测,越来越多的Webshell抛弃了明文传输数据的方式,转而采用加密流量进行通信。
Zhang等人提出了一种在字符级利用卷积神经网络和长短时记忆网络检测Webshell的模型,该方案分别从请求的统一资源定位系统(uniform resource locator,URL)和请求体中提取固定长度的字符,并将这些字符的ASCII码值作为特征向量输入到一个卷积神经网络,再将卷积神经网络的隐藏层输出作为长短时记忆网络的输入进行分类。该方案将流量看作字节流进行处理,用大量的明文Webshell流量进行学习是可以学习到一些Webshell流量特征的。并且理论上该方法也适用于加密Webshell流量,但是需要利用大量采用各种加密算法加密的Webshell流量进行训练。
2.2.2 流量行为
许多Webshell为了绕过基于流量内容的检测工具对其通信流量进行了加密,有些在加密前会有一个握手协商阶段,有些则省略了协商阶段直接从第一个报文开始进行加密。有握手协商阶段的Webshell可以利用协商阶段的特征进行检测,但仅仅利用这些特征是不够的,仍会产生较高的误报率,没有握手协商阶段的Webshell因为没有什么明文的特征可以用来进行检测,所以产生的误报率会更高。虽然流量内容是被加密的,但是流量的交互行为是无法加密的,可以通过对流量的交互行为进行分析,从而实现对Webshell通信流量的检测。
3 结语
引用格式:孙昊翔,曹浪,吴迪锋,等.Webshell检测综述[J].信息安全与通信保密,2022(9):82-90.
作者简介 >>>
孙昊翔,男,高级安全咨询顾问,主要研究方向为网络安全、渗透测试、漏洞挖掘;
曹 浪,男,学士,软件工程师,主要研究方向为渗透测试、主机安全风险评估模型;
吴迪锋,男,学士,助理工程师,主要研究方向为网络安全检测模型分析与应用、网络安全异常流量检测、网络安全风险评估;
谭 天,男,硕士,高级工程师,主要研究方向为安全检测引擎、AI 安全。
选自《信息安全与通信保密》2022年第9期(为便于排版,已省去原文参考文献)
商务合作 | 开白转载 | 媒体交流 | 理事服务
请联系:15710013727(微信同号)
《信息安全与通信保密》杂志投稿
联系电话:13391516229(微信同号)
《通信技术》杂志投稿
联系电话:15198220331(微信同号)
还没有评论,来说两句吧...