浅谈webshell检测方式


一  什么是webshell

“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为匿名用户(入侵者)通过网站端口对网站服务器的某种程度上操作的权限。
简单理解:webshell就是一个web的页面,但是它的功能非常强大可以获得一些管理员不希望你获得的权限,比如执行系统命令、删除web页面、修改主页等。
webshell中由于需要完成一些特殊的功能就不可避免的用到一些特殊的函数,我们也就可以对着特征值做检查来定位webshell,同样的webshell本身也会进行加密来躲避这种检测。


二  webshell长什么样子

3.Webshell后门检测

目前针对Webshell的特征检测一般是通过特征比对及文件属性异常的静态检测和基于访问情况、行为模式特征的动态检测方式进行查杀,由于窃密型Webshell通常会伪装成正常的WEB脚本文件,静态特征检测及动态行为检测都无法有效的针对此类后门进行检测。

4.传统及现有的检测方法

4.1静态检测

静态特征检测是指对脚本文件中所使用的关键词、高危函数、文件修改的时间、文件权限、文件的所有者以及和其它文件的关联性等多个维度的特征进行检 测,即先建立一个恶意字符串特征库,例如:“组专用大马|提权|木马|PHP\s?反弹提权cmd执行”,“WScript.Shell、 Shell.Application、Eval()、Excute()、Set Server、Run()、Exec()、ShellExcute()”,同时对WEB文件修改时间,文件权限以及文件所有者等进行确认。通常情况下 WEB文件不会包含上述特征或者特征异常,通过与特征库的比对检索出高危脚本文件。

该检测方法的优点:可快速检测,快速定位;

缺点:容易误报,无法对加密或者经过特殊处理的Webshell文件进行检测。尤其是针对窃密型Webshell无法做到准确的检测,因为窃密型Webshell通常具有和正常的WEB脚本文件具有相似的特征。

4.2动态检测

动态特征检测通过Webshell运行时使用的系统命令或者网络流量及状态的异常来判断动作的威胁程度,Webshell通常会被加密从而避免静态 特征的检测,当Webshell运行时就必须向系统发送系统命令来达到控制系统或者操作数据库的目的,通过检测系统调用来监测甚至拦截系统命令被执行,从 行为模式上深度检测脚本文件的安全性。

优点:可用于网站集群,对新型变种脚本有一定的检测能力。

缺点:针对特定用途的后门较难检测,实施难度较大。

4.3日志分析

使用Webshell一般不会在系统日志中留下记录,但是会在网站的web日志中留下Webshell页面的访问数据和数据提交记录。日志分析检测 技术通过大量的日志文件建立请求模型从而检测出异常文件,称之为:HTTP异常请求模型检测。例如:一个平时是GET的请求突然有了POST请求并且返回 代码为200、某个页面的访问者IP、访问时间具有规律性等。

优点:采用了一定数据分析的方式,网站的访问量达到一定量级时这种检测方法的结果具有较大参考价值。

缺点:存在一定误报,对于大量的访问日志,检测工具的处理能力和效率会比较低。

4.4统计学

在Webshell后门检测中被使用较为广泛的一种方法是统计学方法,NeoPi是国外流行的一个基于统计学的Webshell后门检测工具,它使用五种计学方法在脚本文件中搜索潜在的被混淆或被编码的恶意代码。

NeoPi使用以下五种检测方法:

1、信息熵(Entropy):通过使用ASCII码表来衡量文件的不确定性;

2、最长单词(Longest
Word):最长的字符串也许潜在的被编码或被混淆;

3、重合指数(Index
of Coincidence):低重合指数预示文件代码潜在的被加密或被混效过;

4、特征(Signature):在文件中搜索已知的恶意代码字符串片段;

5、压缩(Compression):对比文件的压缩比。

采用这种检测方法也存在明显的弱点,NeoPi的检测重心在于识别混淆代码,它常常在识别模糊代码或者混淆编排的木马方面表现良好。未经模糊处理的 代码对于NeoPi的检测机制较为透明。如果代码整合于系统中的其它脚本之上,这种“正常”的文件极可能无法被NeoPi识别出来。

5.传统检测方法的缺陷

现有技术是针对普通的脚本后门、以控制服务器为目的、通常包含较为明显的静态特征或者行为模式,不能对窃密型后门进行有效检测。

由于业务系统更新频繁,WEB脚本文件相关的属性经常发生变化所以偏重于文件属性检测的方法往往会产生更多的误报,基于动态行为检测的方法往往技术 难度较大,难以实现,而且对系统造成的性能影响较大,甚至可能对系统稳定性造成影响,基于日志的检测方法,一方面,由于业务功能较多且复杂,部分功能可能 很少会被用到,其日志访问可能会命中某些检测规则从而造成更多的误报,另一方面,大量的日志记录处理起来会对服务器性能产生负担、而且由于日志量巨大检测 过程消耗时间长,检测速度较慢。而窃密型Webshell后门往往会模拟正常的数据库操作、不具有较为明显静态特殊属性、被访问的次数比较少无法形成较为 明显的访问特征,通过日志分析也很难发现。

6.新型Webshell后门检测方法设计

6.1检测方法

6.1.1基于数据库操作审计的检测方式

针对窃密型Webshell必须具有操作数据库的能力,可以引申出一种新的检测方法,通过分析正常WEB脚本文件和窃密型Webshell对数据库操作的差异进行分析是本检测方法所重点研究的方向。

正常情况下WEB站点进行数据操作的过程应该是重复性且较为复杂的查询过程,这种查询通常精确度非常高,查询过程不会出现类似于“select * from”这种查询语句。正常的WEB脚本在进行数据库操作的过程中也不会出现跨越数据库查询的情况,一旦出现这种现象基本可以判断为非正常的WEB脚本 操作过程。

就以上思路设计如下的检测方案:

审计数据操作记录。通过审计数据库操作记录可以单独的为每一个WEB站点甚至WEB站点中的每一个脚步文件建立查询请求模型,通过几天甚至数月的自 我学习过程来学习并维护一份查询请求数据库。该数据库的内容包含了每次查询操作的详细信息、请求归类和分析结果。并且建立动态查询请求规则,Agent一 旦检测到违反该规则的查询请求后会向Server端传递相关信息,Server端再结合其它的扫描过程综合判断发起请求的文件是否为Webshell,并 最终决定是否向管理员报警。

6.1.2建立机器学习日志分析系统

由于数据库操作记录日志量非常大,使用人工的方法难以进行精确筛选和审计。所以需要建立一套机器自学习的日志审计系统。该日志审计系统主要基于查询模型白名单学习与数学统计模型这两方面进行设计。

  • 查询模型白名单学习系统:

在一个网站系统中,由于系统业务逻辑相对固定,执行的数据库查询语句可以归类并且是可预测的,基于这些事实可以建立一套自学习系统,在无人值守的状 态下进行无监督的机器学习。在对日志进行泛化处理之后,根据特征(包括时间,查询语句,参数等)建立N维的特征向量。使用k-均值聚类算法对日志进行初步 分组。其中对参数的处理使用局部加权线性回归算法预测参数类型。对聚类后的数据进行抽样,使用贝叶斯决策树进行抽样结果的机器决策。

  • 数学统计模型系统:

由于窃密型web应
用脚本后门只服务于入侵者,所执行的查询语句也是超出业务系统正常使用逻辑的,在一个有一定访问量级的业务系统中,窃密使用的查询语句是执行量最少的。对
业务系统数据库的日志进行参数归一化处理后,正常应用中的查询语句与窃密使用的语句从数量上来看一定有数量级的差距。可以建立查询语句的统计模型,也可以
对窃密型Webshell行为进行审计。

6.2检测系统设计

该方法有两种实现过程:

一种是直接在数据库服务器上增加日志审计客户端,可以实时的审计数据库操作记录。

优点是审计全面并且处于攻击后方被人为破坏几率较小;

缺点是数据库在开启较多的日志记录的情况下会造成严重的性能负担。

另外一种实现是方法是在WEB服务器上部署代理型Agent,代理型Agent可以代理所有的数据库操作过程,精确的检索出异常操作,并且较审计型检测速度快。代理型Agent可以经过优化后与中间件进行深度结合能够追踪到发起数据查询请求的具体脚本文件。

优点是检测速度快,精准度高,可以查询到发起查询操作的具体的脚本文件;

缺点是:位于前端WEB服务器上被破坏的可能性较大。学习过程时间稍长

7.总结

只依靠一种检测方法也是很难以进行全面检测的。在真实的环境中进行部署检测系统时需要同步的部署传统检测方法的系统,来达到互补和增强检测结果可行度的目的。

时间: 2024-10-13 19:22:52

浅谈webshell检测方式的相关文章

浅谈webshell检测方法 寒龙博客转载

一  什么是webshell"web"的含义是显然需要服务器开放web服务,"shell"的含义是取得对服务器某种程度上操作权限.webshell常常被称为匿名用户(入侵者)通过网站端口对网站服务器的某种程度上操作的权限.简单理解:webshell就是一个web的页面,但是它的功能非常强大可以获得一些管理员不希望你获得的权限,比如执行系统命令.删除web页面.修改主页等.webshell中由于需要完成一些特殊的功能就不可避免的用到一些特殊的函数,我们也就可以对着特征

浅谈人脸检测之Haar分类器方法

我们要探讨的Haar分类器实际上是Boosting算法(提升算法)的一个应用,Haar分类器用到了Boosting算法中的AdaBoost算法,只是把AdaBoost算法训练出的强分类器进行了级联,并且在底层的特征提取中采用了高效率的矩形特征和积分图方法,这里涉及到的几个名词接下来会具体讨论. 在2001年,Viola和Jones两位大牛发表了经典的<Rapid Object Detection using a Boosted Cascade of Simple Features>和<R

浅谈CSRF攻击方式

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. 三.CSRF漏洞现状 CSRF这

浅谈CSRF攻击方式(转)

add by zhj: 在看Django开发的应用时,看到了CSRF,然后搜到了这篇文章,讲的不错.其实CSRF 攻击也蛮简单的.当你登陆网站A后,会在本地存有cookie,在cookie没有过期的情况下,你又去访问 网站B,而网站B的js中包含发给A的http请求(即http的域名是A),因为这个请求的域名是A,所以会 携带你的对于A域名的cookie,这样就在你不知情的情况下完成了一次操作. 原文:http://www.cnblogs.com/hyddd/archive/2009/04/09

【转】浅谈CSRF攻击方式

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. 三.CSRF漏洞现状 CSRF这

Hibernate更新部分字段浅谈

update语句是在Hibernate的Configuration的时候生成的,不能动态改变.为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题. 如果想要做到只更新改变了的字段,必须做到两点:1.对PO的每个属性设置version进行状态跟踪2.update语句是动态生成的,在实际向数据库更新的时候,依次检查每个属性的version,决定哪些属性需要更新,动态构造update语句. 单单要做到上述第一点,就势必要给PO的操作带来沉重的负担

浅谈Miller-Rabin素数检测算法

浅谈Miller-Rabin素数检测 对于素数判断的操作,我们通常使用的是时间复杂度为\(O(\sqrt N)\)的试除法.按理说这种复杂度已经是较优秀的了,但是假如给定的需要判断的数极其之大,并且给定的时限不够以\(O(\sqrt N)\)的试除法来判断,该怎么办? 题出错了 想得美. 于是,今天的主角出场了:Miller-Rabin素数检测. Miller-Rabin素数检测算法用于在短时间内判断出一个数是否是质数,时间复杂度比试除法优秀,应该是\(O(T\times \log N)\)级别

浅谈程序员创业(要有一个自己的网站,最好的方式还是自己定位一个产品,用心把这个产品做好)

浅谈程序员创业 ——作者:邓学彬.Jiesoft 1.什么是创业? 关于“创业”二字有必要重新学习一下,找了两个相对权威定义: 创业就是创业者对自己拥有的资源或通过努力能够拥有的资源进行优化整合,从而创造出更大经济或社会价值的过程.——百度百科 创业是一种思考.推理和行为方式,它为机会所驱动,需要在方法上全盘考虑并拥有和谐的领导能力.创业必须要贡献出时间.付出努力,承担相应的财务的.精神的和社会的风险,并获得金钱的回报.个人的满足和独立自主.——互动百科 两者都给出了明确的创业定义,这里想着重想

浅谈Windows平台下C++调用静态链接库的方式

浅谈Windows平台下C++调用静态链接库的方式 1. 什么是静态链接库?为什么要用静态链接库? 维基百科上关于静态库的解释是这样的:在计算机科学里,静态库(英语:Static library, Statically-linked library),或称静态库,是一个外部函数与变量的集合体.静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件. 由上面的解释可以很清楚的看