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 相关文章推荐
?繁体转换的class
Oct 09 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
php使用exec shell命令注入的方法讲解
Nov 12 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
php递归实现无限分类的方法
Jul 28 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
浅谈Yii乐观锁的使用及原理
Jul 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 setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
Javascript实现的分页函数
2006/12/22 Javascript
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python使用pil生成缩略图的方法
2015/03/26 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
简析Python的闭包和装饰器
2016/02/26 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
欢迎领导检查标语
2014/06/27 职场文书
婚内分居协议书范文
2014/11/26 职场文书
污染环境建议书
2015/09/14 职场文书
高三英语教学反思
2016/03/03 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android