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

一  什么是webshell

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

下图就是一张php webshell的截图,它的功能还是比较全的,如果你是网站管理员的话肯定是不希望普通用户获得下面的权限的。

三   webshell检测有哪些方法
 
如果你怀疑你的网站被人上传了webshell或者你需要检查一下需要上线的代码中是否被嵌入了shell代码,就需要对这些文件进行扫描,那么有哪些方法可以扫描出这些webshell呢?
下面列举一下,也就是我们的webshell扫描工具中实现的功能。
1 求文件的重合指数index of coincidence(缩写为IC)
首先介绍一下什么是IC?

IC是用来判断文件是否被加密的一种方法。它的计算公式是这样的:
Σ(fi * (fi-1))/N(N-1)    :fi 代表样本中某个字母出现的比率,N代表字母出现在样本中的个数
通过计算,我们可以得到以下两个值:
english的IC值为0.0667,
english中一个完全随机的字符串的IC值为0.0385
那么这两个值有什么意义呢?
简单来说(english),
加密文件的IC值接近0.0385
明文文件的IC值接近0.0667
好了,那么我们就可以计算每个文件的IC值,如果这个文件的IC值接近0.0385,那么我们认为它是加密的,而一个web中加密的文件一般就意味着它是个为了逃避检测的webshell。
2   求信息熵
    信息熵是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。
    熵是从整个集合的统计特性来考虑的,它从平均意义上来表征信源的总体特征,其公式为:

如果有一个系统S内存在多个事件S = {E1,…,En}, 每个事件的机率分布 P = {p1, …, pn},则每个事件本身的讯息为
Ie = ? log2pi
(对数以2为底,单位是位元(bit))
Ie = ? lnpi
(对数以e为底,单位是纳特/nats)
如英语有26个字母,假如每个字母在文章中出现次数平均的话,每个字母的讯息量为
I_e = -\log_2 {1\over 26} = 4.7
而汉字常用的有2500个,假如每个汉字在文章中出现次数平均的话,每个汉字的信息量为
I_e = -\log_2 {1\over 2500} = 11.3
整个系统的平均消息量为
H_s = \sum_{i=1}^n p_i I_e = -\sum_{i=1}^n p_i \log_2 p_i
因此我们可以求每个文件的信息熵值,值越大,为webshell的可能性越高。
3、求文件中的最长单词
    求一个文件中的最长单词是多长,比较异常的长单词是很可疑的。如下面的第一位的有84070,毫无疑问他是加密后的一整串字符串,极有可能是webshell
84070        /home/wwwroot/default/webshell/css.php
4、文件的可压缩比
文件的压缩比=压缩文件后的大小/文件的原始大小。
那么什么样的文件的压缩比比较大呢?这就要说到压缩算法的本质:
压缩的实质,在于消除特定字符分布上的不均衡,通过将短码分配给高频字符,而长码对应低频字符实现长度上的优化。
做了个简单的实验:将一个txt文件中填充了一堆的a字符,总大小为345KB,用7z压缩后为1K

那么我们是否可以这样理解,由base64编码过的文件,消除了非ascii的字符,这样实际上base64编码过的文件的字符就会表现为更小的分布的不均衡,压缩比就会变大。
5、特征值匹配
这里提到的特征值匹配分为2个部分:第一个是匹配特征函数和代码,也就是说webshell中会用到的而一般文件不会用到的函数和代码。第二个是指匹配特定webshell中的特征值。
第一种情况我们需要对这些函数和特征代码做整理,然后与文件进行匹配。
第二种情况需要收集出现过的webshell,将其中的特征码提取出来。目前已知的库位500个webshell的特征库,可以准确识别99%的已知的webshell。
6、文件属性
第一种:在web服务器中,文件一般的创建时间是几种的,如果某些文件的创建时间比较异常,那么它就有可能是webshell。
第二种:在web攻击过程中,有一种手法是利用mysql到出一句话木马到web目录中,那么这个导出的文件有其特殊性,所有导出的文件的权限都是666.那么我可以这么认定,权限为666的文件有可能是webshell。

四 朴素贝叶斯模型

以上几种方法都有其准确率和误报情况,经过测试,每个方法都能检测出一部分webshell并且存在着一定程度的误报,那么如何将他们的检测结果整合起来,来更准确的判定一个文件是否webshell?
由于我们的检测方法基本上是离散的,所以考虑使用朴素贝叶斯模型。
首先用数学语言描述一下我们的问题:
一个文件的检测结果有两种:是webshell和不是wenshell。那么检测结果是webshell的概率我们用P(y=1)来表示,检测结果不是webshell的概率我们用P(y=0)来表示。
假设我们的检测方法有5种,那么x = [x1,x2,x3,x4,x5].
假设我们检测一个文件后各个检测方法的结果为:x1 = 1,x2=0,x3=0,x4=0,x5=1
那么我们的目的是计算出P(y=1|x)和P(y=0|x)。也就是计算出该文件是webshell和不是webshell的概率各是多少,概率更大的我们就做为最终结果。
下面我们推演一下:
首先是贝叶斯公式为:

那么我们需要的P(y=1|x)为:


由于P(y=1|x)和P(y=0|x)中的分母都是一样的,所以我们只要求出分子进行比较,那个值比较大就取那个值。
现在我们未知的值为p(x1=1|y=1),p(x2=0|y=1),p(x3=0|y=1),p(x4=0|y=1),p(x5=1|y=1),p(y=1)
这些值应该如何得到呢?
首先我们需要一个样本,样本中大量的web文件,其中混有各种webshell,这些标签我们是可以确定的,那么下面我们要做的就是利用程序对这些样本进行检测,根据检测结果计算出我们需要的值,比如:
p(x1=0|y=1):它代表的意思就是检测的文件是webshell,利用x1检测方法的检测结果为0(不是webshell)
如果结果为P(y=1|x)>P(y=0|x),我们就判定该文件是webshell

时间: 2024-11-09 16:53:05

浅谈webshell检测方法 寒龙博客转载的相关文章

SiteServer CMS 系统漏洞 -寒龙博客

siteserver 漏洞先看简介:SiteServer CMS 网站内容管理系统(著作权登记号2008SR15710)是定位于中高端市场的CMS内容管理系统,能够以最低的成本.最少的人力投入在最短的时间内架设一个功能齐全.性能优异.规模庞大的网站平台. SiteServer CMS 是基于微软.NET 平台开发的网站内容管理系统,它集成了内容发布管理.多站点管理.定时内容采集.定时生成.多服务器发布.搜索引擎优化.流量统计等多项强大功能,独创的 STL 模板语言,通过Dreamweaver 可

中国寒龙博客www.hackerschina.org:代码审计:PHP中is_numeric函数十六进制绕过BUG 发生的安全问题有哪些?

0×00 简介国内一部分CMS程序里面有用到过is_numberic函数,我们先看看这个函数的结构bool is_numeric ( mixed $var )如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE. 0×01 函数是否安全接下来我们来看个例子,说明这个函数是否安全. $s = is_numeric($_GET['s'])?$_GET['s']:0; $sql="insert into test(type)values($s);";//是 values($

浅谈webshell检测方式

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

菜刀绕过安全狗 。 -中国寒龙博客

琴日骚总带领落叶哥哥一起日一站,忽遇一狗,后面跟小骚猪一起砍死了小狗,没技术含量,本来想让骚猪发到乌云上混个ID算,谁知那只猪仔喜欢潜水不要ID,不喜欢冒泡,落叶哥哥就直接发ZONE分享下算了 传左shell上去但系被狗拦左,shell过狗仲系好容易噶,但系过左狗之后狗狗仲系拦菜刀提交的数据包 然后骚总想到了个方法,就系在一句话解密传递的数据 菜刀连接PHP一句话时会自己重新定义一个z0变量来执行PHP代码,我们只要用OD把EVAL POST去掉就得咯,一句话马的密码随便填,不就能过狗狗了吗 一

浅谈 JSON.stringify 方法

用过 json 的应该都知道,把一个对象通过 stringify 之后提交给后台或者存储在 Storage 里是很常用的手段.但是 IE6-7 下没有 JSON 对象,所以要借助 json2.js 来实现. 今天我们来简单介绍下 stringify 方法的一些正确使用姿势吧.当然,让高手们贱笑了,本文只是分享一些方法给新手朋友们. var data = [ {name: "王尼玛", sex:1, age: 30}, {name: "王尼美", sex:0, age

mssql2005存手工注入漏洞附攻击方法- 寒龙网出品

/**/跟空格的作用一样,有的时候可以过一些过滤爆库语句,修改红色部分的数字挨个猜出库 /**/and/**/(select/**/top/**/1/**/isnull(cast([name]/**/as/**/nvarchar(500)),char(32))%2bchar(124)/**/from/**/[master].[dbo].[sysdatabases]/**/where/**/dbid/**/in/**/(select/**/top/**/1/**/dbid/**/from/**/[

Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法。

http://fairwoodgame.com/blog/?p=38 Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法. Posted in  Unity on August 6, 2013Comments: 暂无评论 太简单了.我们知道iOS里有个URL Scheme的东西(这个我还没深究,希望有大神帮我贴个教程,十分感谢~另外Android也有),可以通过打开一个URL来进入iOS的某些应用.比如下面这个链接在iOS里点击就可以直接进入爱掼蛋

浅谈数据初始化方法

浅谈数据初始化方法 在定制开发的信息化项目实施过程中,我们发现衡量一个项目成功与否,关键看以下三个指标: v人: 系统的利益相关人的需求是否都得到了满足: v系统:软件本身是否可用.易用.稳定.有效率: v数据:数据是否准确.可靠.稳定支持业务的运作: 从这个角度来说,数据在信息系统项目实施过程中有着举足轻重的地位,特别是数据初始化的成功与否是源头和决定因素.下面将数据初始化的过程分解为八个步骤,以确保数据初始化过程的严谨性和科学性. 步骤一:系统数据库表的分析:对信息系统数据库表进行分析,了解

6个方法,用博客建立你的个人“品牌”

6个方法,用博客建立你的个人"品牌" 导读: 写这篇文章,是因为我昨晚上看到"长尾"这本书的作者,克里斯.安德鲁的一句话:你的品牌(能力) 不是由你说了算的,是由谷歌说了算. 我看完了这句话之后,深有感悟,在现在互联网的大时代里,不管我们喜欢与否,我们都已经存在于这个平行世界里,,也就是说我们每个人每天都不知不觉的在互联网上构建这自己的个人"品牌".那么毫无疑问,良好的个人品牌会有利于我们的职业发展,甚至会为我们带来很多商务机会,那么"