任意文件上传

摘要:
HttpServletResponseresponse){Stringroot=request.getServletContext().getRealPath(“/upload”);list=upload.parseRequest(request);it.isFormField()){it.write(newFile(root+“/”+it.getName()));

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 相关参考

http://blog.csdn.net/worn_xiao/article/details/52357167

http://www.ituring.com.cn/article/177592

http://sec.chinabyte.com/352/13843352.shtml

http://www.2cto.com/article/201602/490414.html
---------------------
作者:TaneRoom
来源:CSDN
原文:https://blog.csdn.net/tanzhen1991910/article/details/53260446?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

免责声明:文章转载自《任意文件上传》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SVG初识SpringBoot入门之内嵌Tomcat配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue中&amp;lt;template&amp;gt;中v-for的使用以及&amp;lt;template&amp;gt;多层嵌套问题

一、在template中使用v-for没有效果 如上面代码所示想循环展示子菜单时使用的是v-for命令,但执行后却没有效果,子菜单的数据获取不到。 原因:v-for是循环指令,它返回多个值,而这里的template是根节点,根节点只有一个,根节点不能有多个,所以v-for写在根节点上就有问题,行不通。 解决:在其外面可以包裹一层div,使其不是根节点即可...

ln (link)命令

ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。 1.命令格式:  ln [参数][源文件或目录]...

C#中使用Surfer

做地理信息或者绘制等值线,都会选择Surfer这个软件。这个软件对我们的作用有两个(1)插值(2)绘图。 软件:Windows 7 x64,Microsoft Visual Studio 2012 RC,Surfer 10 一、添加引用,Surfer在COM组件中。 然后在代码中加入 using Surfer; 二、创建一组原始数据文件命名为data.d...

版本基线自动化之windows

1、背景: 目前项目维护周期过程中,制作调试版本和对外发布版本次数比较频繁,流程过于繁琐和随意,且打包制作人成为瓶颈,为了规范版本基线流程和实现全员自动化参与,拟定版本基线自动化方案。  2、目标: 版本基线自动化方案的实施,主要任务分为配置管理自动化,编译做包自动化,版本发布自动化。主要目标是实现一键式做包和发布,减少人为误操作、释放人力资源、提高开发效...

git--指定不上传的文件夹

在使用 vue-cli 脚手架的时候,有一个依赖模板文件夹是不希望被上传到git上的,因为里面文件太多了。 解决办法:手动创建git忽略push清单,node_module以及自身 1.文件夹内右键git bash,输 touch .gitignore,注意中间有空格。  2.编辑器打开生成的 .gitignore 文件,加入: node_modules...

JAVA协程 纤程 与Quasar 框架

ava使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你愿意的话可以用-Xss来调小点),更不要说线程切换带来的开销了 为了节省开销,程序员玩出了很多花样。 最常用的是线程池(线程复用,但是完全无法处理阻塞调用的问题...