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 相关文章推荐
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
php实现word转html的方法
Jan 22 PHP
Yii CGridView用法实例详解
Jul 12 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
PHP implode()函数用法讲解
Mar 08 PHP
PHP常量define和const的区别详解
May 18 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
input file获得文件根目录简单实现
2013/04/26 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
python发送HTTP请求的方法小结
2015/07/08 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
浅谈Python 函数式编程
2020/06/20 Python
高校自主招生自荐信
2013/12/09 职场文书
大学生毕业的自我评价分享
2014/01/02 职场文书
读书活动总结
2014/04/28 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
寻找成龙观后感
2015/06/12 职场文书
退休教师追悼词
2015/06/23 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server