JAVA文件上传漏洞防御

admin 2022年12月7日11:48:33评论67 views字数 1968阅读6分33秒阅读模式

通过 String fileType = fileItem.getName().substring(i+1);获取到后缀,并使用equals进行限制。

@WebServlet("/uploads")public class UploadFile extends HttpServlet{    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); if(ServletFileUpload.isMultipartContent(req)){ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> list = upload.parseRequest(req);
for(FileItem fileItem:list){ if(!fileItem.isFormField()){ int i = fileItem.getName().lastIndexOf('.'); if(i>0){ String fileType = fileItem.getName().substring(i+1); System.out.println("上传的类型为:"+fileType); if(fileType.equals("png")){ System.out.println("上传成功!"); System.out.println("上传的文件名:"+fileItem.getName()); fileItem.write(new File("web根路径"+fileItem.getName())); }else{ System.out.println("非法上传,文件后缀为"+fileType); } }
}
} } catch (Exception e) { e.printStackTrace(); } }
}
}

现在测试一下,成功拦截掉非png后缀的:

JAVA文件上传漏洞防御

白名单绕过

到这里,是不是以为白名单就非常安全了?nonono。。

假设管理员粗心大意,修改了xml配置。

这样就会造成了白名单的绕过,而png就会当做jsp脚本来执行

web.xml文件配置如下
<servlet>    <servlet-name>tomcatpooljsp</servlet-name>    <jsp-file>/test.jsp</jsp-file>  </servlet>  <servlet-mapping>    <servlet-name>tomcatpooljsp</servlet-name>    <url-pattern>/test.png</url-pattern>  </servlet-mapping>

直接上传一个png格式的jsp一句话,成功绕过。

JAVA文件上传漏洞防御

这里是看到网上之前分享的防御姿势,但是吧....感觉安全性还是不如白名单高。

代码如下,通过判断文件头来进行下一步操作。(ps:自己看看就好)

// 获得文件头部字符串    public static String bytesToHexString(byte[] src) {        StringBuilder stringBuilder = new StringBuilder();        if (src == null || src.length <= 0) {            return null;        }        for (int i = 0; i < src.length; i++) {            int v = src[i] & 0xFF;            String hv = Integer.toHexString(v);            if (hv.length() < 2) {                stringBuilder.append(0);            }            stringBuilder.append(hv);        }        return stringBuilder.toString();    }        FILE_TYPE_MAP.put("jpg", "FFD8FF"); //JPEG              FILE_TYPE_MAP.put("png", "89504E47"); //PNG              FILE_TYPE_MAP.put("gif", "47494638"); //GIF
俺的原创:https://www.freebuf.com/vuls/304252.html

原文始发于微信公众号(HACK安全):JAVA文件上传漏洞防御

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月7日11:48:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JAVA文件上传漏洞防御http://cn-sec.com/archives/1449438.html

发表评论

匿名网友 填写信息