thinkphp 检测上传的图片中是否含有木马脚本
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 检测上传的图片中是否含有木马脚本的更多相关文章
- thinkphp文件上传以及图片处理
文件上传 上传表单 在ThinkPHP中使用上传功能无需进行特别处理.例如,下面是一个带有附件上传的表单提交: <form action="__URL__/upload" e ...
- SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html
SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html 说明: 1.环境:SpringMVC+Spring+Tomcat7+JDK1.7 2.支持 zip和rar格式的压 ...
- thinkphp项目上传到github,为什么缺少很多文件
thinkphp项目上传到github,为什么缺少很多文件 问题: 把tp5项目push到码云(类似github)上,为什么没有thinkphp这个核心库? 然后我看了下码云和github上,官方的t ...
- thinkphp将上传的临时文件移动到指定目录
thinkphp将上传的临时文件移动到指定目录 新建common.php文件 <?phpuse think\facade\Env; /** 移动上传的临时文件 * * @img_dir stri ...
- 批量上传文件到HDFS的Shell脚本
在做Hadoop数据挖掘项目的时候,我们第一步是源数据的获取,即把相应的数据放置到HDFS中,以便Hadoop进行计算,手动将文件上传到HDFS中,未免太费时费力,所以我们可以采取像Flume一样的框 ...
- thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成
目录 1.案例 1.1图片上传 1.2进行图片木马检测 1.3缩略图生成 1.4控制器中调用缩略图生成方法 1.案例 前言:在thinkphp框架的Thinkphp/Library/Thin ...
- Linux 下 ---ThinkPHP 图片上传提示:上传根目录不存在!请尝试手动创建
2016年11月15日11:15:47 Windows下如果碰到如此问题,要看文件保存根路径里的rootpath,比如ThinkPHP框架里config.php文件里的的参数配置: //文件上传相关配 ...
- ThinkPHP图片上传
ThinkPHP是国内比较流行的轻量级的PHP框架,它在国内流行的一个最主要的因素在于它的说明文档非常健全完善,以及它源码内的注释都是中文的,方便于英语能力较差的程序员学习. 图片上传在网站里是很常用 ...
- ThinkPHP文件上传类
TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...
随机推荐
- 第01篇 说一下Setting,我一直没有讲过
settings 调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEn ...
- Test Index
top1 top11 top2 top1 top11 top2
- Android 之 Spinner 键值对的绑定(转)
很多时候我们会在下拉菜单中绑定一个值,但是 Spinner本身不提供这样的服务 于是在网上找了N久,终于找到一个简单易用的方案;废话不多说,直接上菜了 首先要定义一个Item类,有以下要注意的: ...
- [洛谷P2596] [ZJOI2006]书架
洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...
- 初识Webx 1
Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx框架是一个稳定.强大的Web框架.建立在Spring ...
- jsp05 指令与动作
JSP7个动作指令如下 : jsp:forward: 执行页面转向,将请求的处理转发到下一个页面. jsp:param: 用于传递参数,必须与其他支持参数曲标签一起使用. jsp:include: 用 ...
- java collection(一)
1.Collection层次结构: 2.集合Conllection的基本概念: (1)集合的基本认识:如StringBuffer&StringBuilder是集合(存储的对象类型是String ...
- python进行机器学习(四)之模型验证与参数选择
一.模型验证 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 这里我们将 ...
- c语言中的输入
先打个白条有时间在写 c语言中输入一行回车之后,以空格为单位进行的分割
- sqlmap参数说明
--delay 设置每隔几秒测试一次注入 --safe-url 设置sqlmap要访问的正常url --safe-freq 设置每测试多少条注入语句后才去访问safe-url --code 设置能正常 ...