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 16 PHP
php mysql数据库操作分页类
Jun 04 PHP
gd库图片下载类实现下载网页所有图片的php代码
Aug 20 PHP
php自动给文章加关键词链接的函数代码
Nov 29 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
destoon二次开发常用数据库操作
Jun 21 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 PHP
简单谈谈PHP中的trait
Feb 25 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 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树型类实例
2014/12/05 PHP
php简单生成随机数的方法
2015/07/30 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python实现对字符串的加密解密方法示例
2017/04/29 Python
Django中的Model操作表的实现
2018/07/24 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python制作抖音代码舞
2019/04/07 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
小学一年级学生评语
2014/04/22 职场文书
一个都不能少观后感
2015/06/04 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
浅谈python中的多态
2021/06/15 Python
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android
Go语言编译原理之源码调试
2022/08/05 Golang