php检测图片木马多进制编程实践


Posted in PHP onApril 11, 2013

前不久,我申请加入了某开源组织,他们要我写一个功能用来检测图片中是否有木马脚本。
其实一开始我什么也不知道,只是后来在网上查了一些资料,找到的全是有制作图片木马的教程,并没有找到检测的程序。

经过几番思索之后,决定从制作原理来分析这种木马程序。这种木马程序是十六进制编码写的,我灵机一动,写了以下这个上传类。最终通过了组织测验。呵呵

现在把它拿出来给大家分享,有什么不好的地方,还请指正! anyon@139.com;

<?php 
/** 
+------------------------------------------------------------------------------ 
* Upload 文件上传类 
+------------------------------------------------------------------------------ 
* @package Upload 
* @author Anyon <Anyon@139.com> 
* @version $Id: Upload.class.php 2013-3-20 21:47:23 Anyon $ 
+------------------------------------------------------------------------------ 
*/ 
class Upload { 
private static $image = null; 
private static $status = 0; 
private static $suffix = null; 
private static $imageType = array('.jpg', '.bmp','.gif','.png'); 
private static $message = array( 
'0' => '没有错误发生,文件上传成功。', 
'1' => '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。', 
'2' => '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。', 
'3' => '文件只有部分被上传。', 
'4' => '没有文件上传。', 
'5' => '未能通过安全检查的文件。', 
'6' => '找不到临时文件夹。', 
'7' => '文件写入失败。', 
'8' => '文件类型不支持', 
'9' => '上传的临时文件丢失。', 
); 
//@ 开始执行文件上传 
public static function start($feild = 'file') { 
if (!empty($_FILES)) { 
self::$status = $_FILES[$feild]['error']; 
if (self::$status > 0) 
return array('status' => self::$status, 'msg' => self::$message[self::$status]); 
self::$image = $_FILES[$feild]['tmp_name']; 
self::$suffix = strtolower(strrchr($_FILES[$feild]['name'], '.')); 
return array('status' => self::_upload(), 'path' => self::$image, 'msg' => self::$message[self::$status]); 
} else { 
return array('status' => self::$status, 'msg' => self::$message[self::$status]); 
} 
} 
//@ 私有 上传开始 
private static function _upload($path = './upload/') { 
date_default_timezone_set('PRC'); 
$newFile = $path . date('Y/m/d/His') . rand(100, 999) . self::$suffix; 
self::umkdir(dirname($newFile)); 
if (is_uploaded_file(self::$image) && move_uploaded_file(self::$image, $newFile)) { 
self::$image = $newFile; 
if (in_array(self::$suffix, self::$imageType)) 
return self::checkHex(); 
else 
return self::$status = 0; 
} else { 
return self::$status = 9; 
} 
} 
//@ 私有 16进制检测 
private static function checkHex() { 
if (file_exists(self::$image)) { 
$resource = fopen(self::$image, 'rb'); 
$fileSize = filesize(self::$image); 
fseek($resource, 0); 
if ($fileSize > 512) { // 取头和尾 
$hexCode = bin2hex(fread($resource, 512)); 
fseek($resource, $fileSize - 512); 
$hexCode .= bin2hex(fread($resource, 512)); 
} else { // 取全部 
$hexCode = bin2hex(fread($resource, $fileSize)); 
} 
fclose($resource); 
/* 匹配16进制中的 <% ( ) %> */ 
/* 匹配16进制中的 <? ( ) ?> */ 
/* 匹配16进制中的 <script | /script> 大小写亦可*/ 
if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode)) 
self::$status = 5; 
else 
self::$status = 0; 
return self::$status; 
} else { 
return self::$status = 9; 
} 
} 
//@ 私有 创建目录 
private static function umkdir($dir) { 
if (!file_exists($dir) && !is_dir($dir)) { 
self::umkdir(dirname($dir)); 
@mkdir($dir); 
} 
} 
}
PHP 相关文章推荐
建立文件交换功能的脚本(三)
Oct 09 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
PHP curl模拟登录带验证码的网站
Nov 30 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
php微信公众号开发之二级菜单
Oct 20 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
PHP开发API接口签名生成及验证操作示例
May 27 PHP
谈谈关于php的优点与缺点
Apr 11 #PHP
如何用PHP实现插入排序?
Apr 10 #PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 #PHP
克隆一个新项目的快捷方式
Apr 10 #PHP
str_replace只替换一次字符串的方法
Apr 09 #PHP
apache和php之间协同工作的配置经验分享
Apr 08 #PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 #PHP
You might like
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
python使用心得之获得github代码库列表
2014/06/25 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Python上下文管理器和with块详解
2017/09/09 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
Python语言快速上手学习方法
2018/12/14 Python
python机器学习实现决策树
2019/11/11 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
自我评价范文分享
2014/01/04 职场文书
项目经理任命书内容
2014/06/06 职场文书
争先创优个人总结
2015/03/04 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书