webshell免杀——以PHP为例

优采云 发布时间: 2022-05-10 23:45

  webshell免杀——以PHP为例

  介

  (2)从远程URL中获取数据

  file_get_contents、curl、svn_checkout…

  将需要执行的指令数据放在远程URL中,通过URL_INCLUDE来读取

  (3)从磁盘文件中获取数据

  file、file_get_contents…

  将需要执行的指令数据放在磁盘文件中,利用IO函数来读取

  (4)从数据库中读取

  将需要执行的指令放在数据库中,利用数据库函数来读取

  (5)从图片头部中获取

  exif_read_data…

  将需要执行的指令数据放在图片头部中,利用图片操作函数来读取

  2、代码执行

  (1)常用命令执行函数

  eval、system、assert、exec、shell_exec…

  最普通、标准的代码执行

  (2)LFI

  include、require…

  利用浏览器的伪协议将文件包含转化为代码执行

  (3)动态函数执行

  $()…

  PHP的动态函数特性

  (4)Curly Syntax

  ${${…}}…

  这种思路可以把变量赋值的漏洞转化为代码执行的机会

  3、PHP一句话

  最常见的就是eval和assert:

  一些常见方法:

  二、关于WAF

  要免杀,当然得先了解是谁在杀,主要是D盾、安全狗,护卫神等,其他还有杀毒软件如火绒、360

  其检测思路大概有:

  1、基于流量和字符特征的检测

  既然是字符特征,首先就是对于一些危险函数(上面提到的那些)的检测:

  还有popen ,curl_exec,curl_multi_exec,parse_ini_file,show_source等

  然后是在返回包中检测特殊字符:root或者是其他一些敏感字符串passwd等等

  2、基于文件特征

  主要基于HASH的匹配,取决于样本的捕捉能力及形成特征列表的数量,还是会出现漏报问题。

  这里会对上传上来的文件进行分片处理,之后会对每一个片段进行hash计算,在得到所有片段的hash值后会和之前有的特征列表库进行对比。如果符合某个相似度的要求就认为该文件为webshell。

  3、基于AST语义分析

  为了弥补统计特征的不足,进一步深化,进行语法检测,关注于每个函数和参数,这种方式精确,误报较少。但是对于PHP这种动态特性很多的语言,检测就比较吃力,AST是无法了解语义的。

  其实这一部分有点类似于代码审计,核心问题就是找到那些可疑的函数。有经验的安全人员可能脑海里就有一个表,这个表里放满了各种函数,有点类似于黑名单。在找到函数调用的代码时,如果发现函数名在黑名单中,就认为这是一个“敏感”函数,再执行后续判断;如果函数名不在黑名单中,那么后续的判断也就不用继续了。但是这个名单必须得大而全,而且得考虑很多特殊情况。

  4、动/静态符号执行

  实际是就是去发现没有过滤或者过滤不完全的可控变量,一但存在用户可以控制的代码逻辑,那么危险系数就很高了。

  5、机器学习

  这个需要大量的webshell样本训练,目前来看效果可能还是不太好。而有些算法可解释性比较差,不利于运营。而且存在大量误报的可能。

  6、终极检测引擎Rasp

  在2014年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP。它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。

  RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。

  三、免杀思路

  下面是一些免杀的思路,但实际需要多种思路结合,办法总比困难多

  1、字符串变换

  将关键词进行拼接转换等,来绕过对关键词的检测

  一些可用的方法有:

  ucwords() //函数把字符串中每个单词的首字符转换为大写。ucfirst() //函数把字符串中的首字符转换为大写。trim() //函数从字符串的两端删除空白字符和其他预定义字符。substr_replace() //函数把字符串的一部分替换为另一个字符串substr() //函数返回字符串的一部分。strtr() //函数转换字符串中特定的字符。strtoupper() //函数把字符串转换为大写。strtolower() //函数把字符串转换为小写。strtok() //函数把字符串分割为更小的字符串str_rot13() //函数对字符串执行 ROT13 编码。

  由于eval是语言构造器而不是函数,所以不能被可变函数调用,一般会通过拼接assert来执行;又由于assert在php7.1之后无法这样使用,所以此类免杀方式基本仅能在php5环境下使用

  几个例子: <p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线