1.1 漏洞描述

    上传漏洞这个顾名思义,就是攻击者通过上传木马文件,直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。

    导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。

1.2 漏洞危害

     1)可以得到WEBSHELL

     2)上传木马文件,可以导致系统瘫痪

1.3 漏洞演示

    我们来看看下面这段文件上传代码,使用的是common-fileupload.jar和common-io.jar UploadServlet.java访问路径/UploadServlet

/**
  * 文件上传
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) {
     String root = request.getServletContext().getRealPath("/upload");
     DiskFileItemFactory factory = new DiskFileItemFactory();
     ServletFileUpload upload = new ServletFileUpload(factory);
     try {
         List<FileItem> list = upload.parseRequest(request);
         for(FileItem it:list){
             //如果是file文件类型
             if(!it.isFormField()){
                 it.write(new File(root+"/"+it.getName()));
                 response.getWriter().write("success");
             }
         }
     } catch (Exception e) {
         try {
             response.getWriter().write("exception");
         } catch (IOException e1) {
             e1.printStackTrace();
         }
         e.printStackTrace();
     }
 }


    前端index.jsp有一个上传文件的表单

<form  action="/load/UploadServlet" method="post" enctype="multipart/form-data">
     <input type="file" name="file"/>
     <input type="submit" value="submit"/>        
 </form>


    我们将项目发布到tomcat并且访问http://localhost:8080/load/

    选择要上传的文件提交表单.文件上传也成功,在upload目录下也有我们所上传的文件. (如果是你一个刚毕业刚入行的新人,你可能看不出任何问题),可能很多老鸟大神都知道这个上传功能存在什么问题,要骂我sb! 对没错,这个功能还有一个最大的问题就是没有对上传的文件格式做限制,如果我这里实现写好了一个脚本a.jsp代码如下

<%@page import="java.io.File"%>
 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
 <%
     String root = request.getServletContext().getRealPath("");
     out.write("系统部署绝对路径:"+root);
     File file = new File(root+"/index.jsp");
     file.delete();
 %>


    上传完毕,我们在访问localhost:8080/load/upload/a.jsp,然后你在返回你就会发现一件恐怖的事情,这里不限于做删除操作,还可以自定义主页,看你自己怎么写了! 所以说我们在做上传的时候必须要对上传的文件格式做处理,在上传的时候加入一句判断语句(当然只判断后缀,还可能存在一些问题,最好在加上判断文件前4个字节一起判断(不同文件类型前4字节不同),这样就能很好的避免上述问题!

1.4 修复方案

    1)对文件格式限制,只允许某些格式上传

    2)对文件格式进行校验,前端跟服务器都要进行校验(前端校验扩展名,服务器校验扩展名、Content_Type等)

    3)将上传目录防止到项目工程目录之外,当做静态资源文件路径,并且对文件的权限进行设定,禁止文件下的执行权限。

1.5 相关参考