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正则
Jul 07 PHP
解析php中获取系统信息的方法
Jun 25 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
php求正负数数组中连续元素最大值示例
Apr 11 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
php实现微信支付之企业付款
May 30 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
laravel开发环境homestead搭建过程详解
Jul 03 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中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php服务器的系统详解
2019/10/12 PHP
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
vant实现购物车功能
2020/06/29 Javascript
Python标准库与第三方库详解
2014/07/22 Python
Python入门篇之文件
2014/10/20 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
python 编码规范整理
2018/05/05 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
python 检测图片是否有马赛克
2020/12/01 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
上课迟到检讨书
2014/01/19 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
租赁协议书
2015/01/27 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
15个值得收藏的JavaScript函数
2021/09/15 Javascript
分析Python list操作为什么会错误
2021/11/17 Python