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中数据的批量导入(csv文件)
Oct 09 PHP
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 29 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 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
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
常用简易JavaScript函数
2009/04/09 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
详解Python yaml模块
2020/09/23 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
统计员岗位职责
2013/11/14 职场文书
园林毕业生自我鉴定范文
2013/12/29 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
查摆问题对照检查材料
2014/08/28 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
无故旷工检讨书
2015/08/15 职场文书
高中物理教学反思
2016/02/19 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
Node实现搜索框进行模糊查询
2021/06/28 Javascript