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 相关文章推荐
提高PHP编程效率的53个要点(经验小结)
Sep 04 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 PHP
PHP进程同步代码实例
Feb 12 PHP
详解WordPress中给链接添加查询字符串的方法
Dec 18 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
php中final关键字用法分析
Dec 07 PHP
Zend Framework常用校验器详解
Dec 09 PHP
php简单构造json多维数组的方法示例
Jun 08 PHP
PHP策略模式写法
Apr 01 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
set_include_path在win和linux下的区别
2008/01/10 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
jquery each()源代码
2011/02/14 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
Python中的ceil()方法使用教程
2015/05/14 Python
python如何在循环引用中管理内存
2018/03/20 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
中专生自荐信
2013/10/12 职场文书
法学院方阵解说词
2014/01/29 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
销售工作决心书
2015/02/04 职场文书
Python中rapidjson参数校验实现
2021/07/25 Python