php检测图片木马多进制编程实践

2015-01-24信息快讯网

有制作图片木马的教程,并没有找到检测的程序,从制作原理来分析这种木马程序,写了以下这个上传类与大家分享下,感性的朋友可以参考下

前不久,我申请加入了某开源组织,他们要我写一个功能用来检测图片中是否有木马脚本。
其实一开始我什么也不知道,只是后来在网上查了一些资料,找到的全是有制作图片木马的教程,并没有找到检测的程序。

经过几番思索之后,决定从制作原理来分析这种木马程序。这种木马程序是十六进制编码写的,我灵机一动,写了以下这个上传类。最终通过了组织测验。呵呵

现在把它拿出来给大家分享,有什么不好的地方,还请指正! 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实现Linux服务器木马排查及加固功能
php网站被挂木马后的修复方法总结
php读取excel文件的简单实例
PHP中判断变量为空的几种方法分享
PHP 如何利用phpexcel导入数据库
php实现利用phpexcel导出数据
提高PHP性能的编码技巧以及性能优化详细解析
PHP 通过Socket收发十六进制数据的实现代码
PHP中将ip地址转成十进制数的两种实用方法
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
CodeIgniter上传图片成功的全部过程分享
php读取图片内容并输出到浏览器的实现代码
PHP取二进制文件头快速判断文件类型的实现代码
php采集文章中的图片获取替换到本地(实现代码)
PHP 安全检测代码片段(分享)
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
解析php下载远程图片函数 可伪造来路
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
关于PHP二进制流 逐bit的低位在前算法(详解)
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
谈谈关于php的优点与缺点
如何用PHP实现插入排序?
apache和php之间协同工作的配置经验分享
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
PHP中图片等比缩放的实例
php文本转图片自动换行的方法
php中使用preg_replace函数匹配图片并加上链接的方法
php中使用preg_match_all匹配文章中的图片
php图片加水印原理(超简单的实例代码)
PHP中数字检测is_numeric与ctype_digit的区别介绍
php 计划任务 检测用户连接状态
php中用于检测一个地理IP地址是否可用的代码
php木马webshell扫描器代码
PHP Web木马扫描器代码 v1.0 安全测试工具
PHP取进制余数函数代码
通达OA公共代码 php常用检测函数
PHP中实现中文字符进制转换原理分析
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
©2014-2024 dbsqp.com