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中显示格式化的用户输入
Oct 09 PHP
无数据库的详细域名查询程序PHP版(1)
Oct 09 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
php发送邮件的问题详解
Jun 22 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
php 魔术方法详解
2014/11/11 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python中的默认参数详解
2015/06/24 Python
python实现黑客字幕雨效果
2018/06/21 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
生物技术专业毕业生求职信范文
2013/12/14 职场文书
揠苗助长教学反思
2014/02/04 职场文书
授权委托书样本
2014/04/03 职场文书
股票投资建议书
2014/05/19 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
2016十一国庆节感言
2015/12/09 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏