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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
php利用gd库为图片添加水印
Nov 09 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
Yii2框架自定义类统一处理url操作示例
May 25 PHP
Laravel框架实现抢红包功能示例
Oct 31 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 常用的header头部定义汇总
2015/06/19 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
PHP反射基础知识回顾
2020/09/10 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
原生js实现ajax方法(超简单)
2016/09/20 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
python中管道用法入门实例
2015/06/04 Python
python开发中module模块用法实例分析
2015/11/12 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
人机交互程序 python实现人机对话
2017/11/14 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
python flask安装和命令详解
2019/04/02 Python
python的等深分箱实例
2019/11/22 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
python实现图像拼接功能
2020/03/23 Python
python异步Web框架sanic的实现
2020/04/27 Python
Python必须了解的35个关键词
2020/07/16 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
python 单机五子棋对战游戏
2022/04/28 Python