# 一、漏洞环境信息

POST: http://127.0.0.1:8080/fileupload/multipart

payload:

# 二、修复说明

# 分析service层 public Boolean fileuploadAction(MultipartFile file) 添加修复代码前后分析

文件上传核心代码

    @Override
    public Boolean fileuploadAction(MultipartFile file) throws IOException {
        //1.获取上传文件名
        String srcFileName = file.getOriginalFilename();

        //加入安全检测控制
        Boolean isOk = fileUploadCheck.fileTypeCheck(srcFileName);
        if (isOk==false){
            return false;  //名称类型检测失败则不上传
        }

        //2.获取需要上传到的路径位置
        ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
        String path = servletContext.getRealPath("/")+File.separator+ "static";

        System.out.println("文件上传到本地路径为:"+path);
        //3.执行上传操作,最好文件随机字符串重命名处理
        file.transferTo(new File(path+File.separator+srcFileName));
        return true;
    }

文件校验代码

/*
 文件上传校验
 */
@Component
public class fileUploadCheck {
    private static String[] fileType = {".txt",".jpg",".png",".doc",".docs",".gif"};
    // 文件大小
    static public Boolean fileSizeCheck(){

        return true;
    }
    
    //文件类型
    static public Boolean fileTypeCheck(String FileName){
        if (FileName==null){
            return false;
        }
        int i = FileName.lastIndexOf(".");
        if (i==-1){
            return false;
        }else{
            String type = FileName.substring(i);
            int j = 0;
            for (j = 0; j < fileType.length; j++) {
                if (type.toLowerCase().equals(fileType[j])){
                    return true;
                }
            }
        }
        return false;
    }
}

修复说明

  • 设置文件后缀白名单 {".txt",".jpg",".png",".doc",".docs",".gif"};
  • 获取上传文件后缀名称
  • 判断上传文件后缀名称是否在白名单中,是->上传保存到目标目录 否->拒绝保存操作

# 三、小结

  • 成因:输入未校验
  • 位置:Service层
  • 修复:输入校验
    • 文件大小
    • 文件类型MIME
    • 文件后缀白名单
    • 文件重命名
    • 限制上传目录执行