1.检测原理

  要想检测图片中是否含有木马脚本,首先从制作原理来分析这种木马程序。这种木马程序是十六进制编码写的,图片的十六进制代码中主要包含<% ( ) %>、<? ( ) ?> 、<script | /script>, 所以我们可以通过检测十六进制代码来检测木马脚本。

2.解决方案

  2.1编写Upload类

   要想上传图片文件,我们要自己先定义一个上传文件的方法,然后方法中调用thinkphp中框架写好的Upload类,但是tp框架中的upload类没有检测木马图片的功能,所以我们可以自己写一个含有检测功能的upload类。

<?php
/**
+------------------------------------------------------------------------------
* Upload 文件上传类
+------------------------------------------------------------------------------
* @package Upload
+------------------------------------------------------------------------------
*/
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) { // 若文件大于521B文件取头和尾
$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);
}
}
}

这个类配合自己定义的上传图片的方法  可以检测上传图片是否存在木马脚本

3.制作木马图片 

  3.1制作过程

    1.随便找一张图片,名字改成1.jpg。

    2.将<%eval request("keio")%> 存为1.php。

    3.copy 1.jpg /b + 1.php /a  2.jpg 存为1.bat文件。

    (具体操作方法:打开-运行-cmd,进入下面这个界面,然后cd 进入放置文件的路径,然后输入命令copy 1.jpg/b+1.php 2.jpg 然后回车就系统就会自动把这两个文件组合起来,形成一个含有木马脚本的图片。)

  3.2查看图片

    你可以用text文档打开2.jpg,就发现我们的一句话木马就写入到了图片中。

    解释:

    复制当前目录下的 1.jpg 图片和当前目录下的 1.php 文件并以ASCII代码的方式合并为2.jpg 图片
    运行 1.bat 就会出现一个图片 2.jpg
    而这个2.jpg就是已经做好的木马了

4.上传检测

  我们将制作的木马图片上传,检测我们的十六进制检测木马脚本的方法是不是好使。

    实践是检验真理的唯一途径,大家要手动做一张图片木马进行验证,本人亲测可以检测到。

  有意见和建议的兄弟们,可以留言来交流,批评指正!谢谢

  如果你使用出现问题,可以留言交流!

thinkphp 检测上传的图片中是否含有木马脚本的更多相关文章

  1. thinkphp文件上传以及图片处理

    文件上传 上传表单 在ThinkPHP中使用上传功能无需进行特别处理.例如,下面是一个带有附件上传的表单提交: <form action="__URL__/upload" e ...

  2. SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html

    SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html 说明: 1.环境:SpringMVC+Spring+Tomcat7+JDK1.7 2.支持 zip和rar格式的压 ...

  3. thinkphp项目上传到github,为什么缺少很多文件

    thinkphp项目上传到github,为什么缺少很多文件 问题: 把tp5项目push到码云(类似github)上,为什么没有thinkphp这个核心库? 然后我看了下码云和github上,官方的t ...

  4. thinkphp将上传的临时文件移动到指定目录

    thinkphp将上传的临时文件移动到指定目录 新建common.php文件 <?phpuse think\facade\Env; /** 移动上传的临时文件 * * @img_dir stri ...

  5. 批量上传文件到HDFS的Shell脚本

    在做Hadoop数据挖掘项目的时候,我们第一步是源数据的获取,即把相应的数据放置到HDFS中,以便Hadoop进行计算,手动将文件上传到HDFS中,未免太费时费力,所以我们可以采取像Flume一样的框 ...

  6. thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成

    目录 1.案例 1.1图片上传  1.2进行图片木马检测   1.3缩略图生成   1.4控制器中调用缩略图生成方法 1.案例 前言:在thinkphp框架的Thinkphp/Library/Thin ...

  7. Linux 下 ---ThinkPHP 图片上传提示:上传根目录不存在!请尝试手动创建

    2016年11月15日11:15:47 Windows下如果碰到如此问题,要看文件保存根路径里的rootpath,比如ThinkPHP框架里config.php文件里的的参数配置: //文件上传相关配 ...

  8. ThinkPHP图片上传

    ThinkPHP是国内比较流行的轻量级的PHP框架,它在国内流行的一个最主要的因素在于它的说明文档非常健全完善,以及它源码内的注释都是中文的,方便于英语能力较差的程序员学习. 图片上传在网站里是很常用 ...

  9. ThinkPHP文件上传类

    TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...

随机推荐

  1. 2017 济南综合班 Day 3

    T1  黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数 ...

  2. 51Nod 1002 数塔取数问题

    Input示例 4 5 8 4 3 6 9 7 2 9 5 Output示例 28 DP: 递推式: dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+arr[i][j]; ...

  3. UOJ#110. 【APIO2015】Bali Sculptures

    印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 YiYi 年 ...

  4. Linux-进程间通信(N): 各种IPC的使用场景

    1. 管道:只能用于具有亲缘关系的进行通信,使用面相对较窄,实际开发中较少使用: 2. FIFO(命名管道):可以用于任意进程间的通信,对于大块数据的传输效率较高,可应用于单进程大量数据传递,和多个进 ...

  5. C基础 一个可以改变linux的函数getch

    引言  -  getch简述 引用老的TC版本getch说明. (文章介绍点有点窄,  应用点都是一些恐龙游戏时代的开发细节) #include <conio.h> /* * 立即从客户端 ...

  6. caffe Python API 之Dropout

    net.pool1 = caffe.layers.Pooling(net.myconv, pool=caffe.params.Pooling.MAX, kernel_size=2, stride=2) ...

  7. 包装类、基本数据类型及String类之间的相互转换

    包装类:8种基本数据类型对应一个类,此类即为包装类 一.基本数据类型 包装类 及String之间的转换 1.基本数据类型转化为包装类:调用包装类的构造器      int i=10;     Inte ...

  8. 使用while循环遍历文件

    /* 使用while循环遍历文件*/ [root@localhost test1]# vim 17.py //add #!/usr/bin/python ll = open('/tmp/1.txt') ...

  9. 创建数据库表的SQL语句

    创建表.视图.索引的sql语句如下: CREAT TABLE (列名,数据类型,约束) create view(创建视图) create index (创建索引) 1.primary key(主键) ...

  10. HIbernate学习笔记2 之 主键生成方式

    一.hibernate主键生成方式: 1.常用方式:mysql:自增长生成主键(identity) <generator class="identity"> </ ...