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面向对象全攻略 (四)构造方法与析构方法
Sep 30 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
php获取目录所有文件并将结果保存到数组(实例)
Oct 25 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
php实现文章置顶功能的方法
Oct 20 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 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
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
浅析PHP Socket技术
2013/08/02 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
Python发送email的3种方法
2015/04/28 Python
详解Python的Django框架中的模版继承
2015/07/16 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
浅谈python常用程序算法
2019/03/22 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python用match()函数爬数据方法详解
2019/07/23 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
战友聚会主持词
2014/04/02 职场文书
责任担保书范文
2014/05/21 职场文书
后备干部培训方案
2014/05/22 职场文书
给医院的感谢信
2015/01/21 职场文书
导游欢迎词范文
2015/01/23 职场文书
单位考核聘任报告
2015/03/02 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
SQL Server删除表中的重复数据
2022/05/25 SQL Server