webshell检测方式深度剖析---开篇

从本篇文章开始,笔者计划做一个关于webshell检测方式的小专题。

目的在于深入分析当前常见且流行的几类检测方式,介绍其检测原理,展现各种检测方式在检出率和误报率上的优劣势。

同时在每类检测方式中,选取一款开源、有代表性的webshell检测工具,对其进行深入的、源码级的剖析,加深对这类检测方式的理解。

webshell本身可以以各种语言脚本形式存在,比如php、java、python等,但是尤以php的webshell种类最多,检测难度也最大。因此,本专题以php脚本的webshell为目标对象,后续的原理分析和结果对比也都以php为主。

检测方式

webshell常见的检测方式有如下几类:
webshell检测方式深度剖析---开篇_第1张图片

静态检测

静态检测通过一系列预定义好的正则表达式匹配脚本文件内的特征码,特征值,危险函数等来查找webshell。优点是实现简单,部署方便。缺点是只能查找已知的webshell,并且误报率漏报率会比较高。

其中的难点是对正则库的维护,需要在低误报率的情况下保证检出率。而且正则匹配的性能非常依赖正则表达式的编写。同一检测目的的正则可以有多种写法,而不同的写法在性能上差距非常大(比如正则中大量的.*模糊匹配非常耗费性能),这就特别考验正则库维护人员的正则编写能力。

当然,几乎没有公司会只采用正则这一种方式来检测webshell,更多情况下是采用正则首先做一遍初筛。因此,通常会对正则库中的正则分为严格正则和宽泛正则,命中严格正则的脚本基本可以确定为webshell,而命中宽泛正则的相当于灰色文件(grey),需要进一步采用其他方式进行检测。

最后需要提一句,文件大小对正则匹配的性能也有非常大的影响,针对大文件建议不走正则匹配,或者专门维护一套大文件的高性能正则。

动态检测

webshell被黑客传到服务器之后需要执行才能发挥作用,webshell执行时刻表现出来的特征,我们称为动态特征。

想要通过动态特征进行检测,需要将检测逻辑注入到php解释器中,在脚本的实时执行过程中来监测危险函数的调用。

优点是可以检测未知webshell,而且误报率很低。因为检测逻辑更靠近底层,所以可以直达webshell的本质—命令执行。

缺点是实现较难,通常需要以php扩展的方式加载到php解释器中,这样势必会影响实际的业务性能。同时,php版本也在不断更新迭代,相应的检测扩展也要不断升级。

语法语义检测

语法语义分析形式,是根据php语言编译的实现方式,进行剥离代码、注释,变量、函数、字符串、控制结够等语言单元,来实现关键危险函数的捕捉方式。

通常是将源代码进行语义分析和语法分析,将代码拆分并结构化为中间表示形式,通常是Token(语法片段)或AST(抽象语法树),再在该中间形式上进行进一步分析。

该检测方式本身也属于静态检测的范畴,但是相比正则匹配,可以做更精细的关联分析,在检出率和误报率上提升了一大步。而且在维护上,不用再关注正则的写法,只需要保证威胁函数和外部输入来源的搜集完整性就好。

数据流分析检测

数据流分析通常是在AST(抽象语法树)的基础上构建CFG(控制流图)和DFG(数据流图),以可能的外部输入,如$_POST[“sz”]作为taint数据的起点,分析taint数据的流动路径。

同时搭配危险函数的检测,如果taint数据没有被“净化”(比如对数据调用了escapeshellarg等安全函数),并且流动到了危险函数的参数位置,则可以判断该文件有执行恶意外部参数的可能。

数据流分析的结果可解释性较强,而且检出率和误报漏都可以得到很好的控制,笔者个人比较推荐这种检测方式的应用。

统计学特征检测

某些webshell通常会经过一定的变形混淆,混淆之后的脚本在编码风格上会明显不同于正常脚本,这时会表现出一些特别的统计特征,根据这些统计特征可以检测这类混淆变形的webshell。

这种检测方式的优点很明显,实现简单,部署方便。但缺点也很明显,统计特征更像是针对编码风格的检测,如果你不小心代码写的乱了一点,那就可能被误报成黑样本。

机器学习检测

网络上常见的采用机器学习方法来检测webshell的思路如下:
通过将源代码或者源代码编译成的opcode进行词袋模型和TF-IDF分词后,采用朴素贝叶斯和SVM算法进行模型训练。

笔者的同事曾经实现过这一思路,采用SVM的检出率有86%,朴素贝叶斯的检出率为90%。后续又采用了CNN(卷积神经网络)来训练模型,检出率提高到了98%,但是超高的误报率让其根本无法应用在实际环境中。

日志检测

使用Webshell一般不会在系统日志中留下记录,但是会在网站的web日志中留下Webshell页面的访问数据和数据提交记录。

日志分析检测技术通过大量的日志文件建立请求模型从而检测出异常文件,称之为:HTTP异常请求模型检测。例如:一个平时是GET的请求突然有了POST请求并且返回代码为200、某个页面的访问者IP、访问时间具有规律性等。

webshell的访问特征(主要特征)有以下几个:

  • 少量ip对其发起访问
  • 总的访问次数少
  • 该页面属于孤立页面

当然不是所有的孤立页面都是webshell,以下情况也会造成孤立页面

  1. 隐藏管理后台等正常孤立页面的访问;
  2. 扫描器行为,常见漏洞扫描,PoC扫描,Webshell扫描(日志中经常可以看到常见webshell路径加一句话payload的扫描)——这是最主要的干扰数据,需要剔除;

对于情况1采用白名单的方式,对于情况2需要有针对性的剔除。

优点:采用了一定数据分析的方式,网站的访问量达到一定量级时这种检测方法的结果具有较大参考价值。
缺点:存在一定误报,对于大量的访问日志,检测工具的处理能力和效率会比较低。

检测工具选型

针对每种检测方式,笔者挑选了一款有代表性的开源软件,对该检测方式,软件架构,核心实现细节进行深入讲解。

选择的顺序按照由易到难的顺序进行,大致如下:
webshell检测方式深度剖析---开篇_第2张图片

检测结果评测

最终检测结果检出率评测选择从github搜集的经验证过绝对可用的小马和大马共300个样本作为检出率的评测黑样本集。
误报率评测选择WordPress最新版本5.4.2源码共884个php文件作为误报率的评测白样本集。

你可能感兴趣的:(webshell检测方式深度剖析---开篇)