基于 java 【Web安全】文件上传漏洞及目录遍历攻击
前言:web安全之文件上传漏洞,顺带讲一下目录遍历攻击。本文基于 java 写了一个示例。
原理
在上网的过程中,我们经常会将一些如图片、压缩包之类的文件上传到远端服务器进行保存。文件上传攻击指的是恶意攻击者利用一些站点没有对文件的类型做很好的校验,上传了可执行的文件或者脚本,并且通过脚本获得服务器上相应的权利,或者通过诱导外部用户访问、下载上传的病毒或木马文件,达到攻击的目的。
文件上传漏洞指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。这种攻击方式直接、有效,在对付某些脆弱的系统时甚至没有门槛。
文件上传漏洞的常见利用方式有:
上传Web脚本程序,Web容器解释执行上传的恶意脚本。
上传Flash跨域策略文件crossdomain.xml,修改访问权限(其他策略文件利用方式类似)。
上传病毒、木马文件,诱骗用户和管理员下载执行。
上传包含脚本的图片,某些浏览器的低级版本会执行该脚本,用于钓鱼和欺诈。
总的来说,为了实现一次攻击利用,必须要满足以下条件:
文件能通过前端和后端的过滤和文件处理.
文件内容不会被改变,能够被正确的存储
存储位置是在Web容器控制范围
攻击者有权限访问存储目录
攻击示例
基于 springmvc 的代码
jsp 代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="ctx" value="${pageContext.request.contextPath}" /> <html>
<head>
<title>web 安全之文件上传漏洞</title>
</head> <body>
<form action="${ctx}/uploadFileDemoCtrl/uploadFile" method="post" enctype="multipart/form-data">
选择文件进行上传:<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form> <br/> <form action="${ctx}/uploadFileDemoCtrl/downLoadFile" method="get">
输入需要下载的文件名称:<input type="text" name="filename"/>
<input type="submit" value="下载"/>
</form> </body>
</html>
java 代码
controller 层 到jsp
@RequestMapping("/index")
public String index(){
return "yule/uploadfile/uploadFileDemo";
}
上传文件后台处理
/**
* 文件上传
* 有漏洞的上传文件代码
* @param request
* @return
* @throws IOException
*/
@RequestMapping("/uploadFile")
public String uploadFile(HttpServletRequest request) throws IOException {
// 转型为MultipartHttpRequest
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获得文件到map容器中
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
if(fileMap == null || fileMap.size() == 0){
System.out.println("没有文件!");
return "yule/uploadfile/uploadFileDemo";
} String root = request.getServletContext().getRealPath("/upload");
File savePathFile = new File(root);
if(!savePathFile.exists()){
savePathFile.mkdirs();
} String fileName = null;
String suffixName = null;
MultipartFile mf = null;
InputStream fileIn = null;
List<InputStream> isList = new ArrayList<InputStream>();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
mf = entity.getValue();
fileName = mf.getOriginalFilename();//获取原文件名
suffixName = fileName.substring(fileName.lastIndexOf("."), fileName.length());
try {
fileIn = mf.getInputStream();
isList.add(mf.getInputStream());
LocalFileUtils.upload(fileIn, root, fileName);
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fileIn != null){
fileIn.close();
}
}
} return "yule/uploadfile/uploadFileDemo";
}
运行,页面如下:
上传各种文件到工程下的 upload 文件夹下。
这里可以上传各种文件,因为代码没有做任何的防止文件上传漏洞的行为。这里代码的漏洞非常容易被利用,比如,上传一个有脚本的 jsp 文件 1.jsp,文件如下:
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
String root = request.getServletContext().getRealPath("/upload");
out.write("系统部署文件上传的绝对路径:"+root);
File file = new File(root);
String[] tempList = file.list();
File temp = null;
String fileName;
for (int i = 0; i < tempList.length; i++) {
if (root.endsWith(File.separator)) {
fileName = root + tempList[i];
} else {
fileName = root + File.separator + tempList[i];
}
temp = new File(fileName);
if (temp.isFile()) {
out.write("删除文件:" + fileName + ";");
temp.delete();
}
}
file.delete();
%>
上传成功后,用地址访问该文件,可怕的事情发生了,利用漏洞,会导致 upload 文件夹及下面的文件全部被删除。
目录遍历攻击
文件交互是一种简单的过程,但是由于文件名可以任意更改而服务器支持“~/”,“../”等特殊符号的目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件,这样的缺陷被命名为路径遍历漏洞
示例:
在 jsp 中加入 form 表单下载
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="ctx" value="${pageContext.request.contextPath}" /> <html>
<head>
<title>web 安全之文件上传漏洞</title>
</head> <body>
<form action="${ctx}/uploadFileDemoCtrl/uploadFile" method="post" enctype="multipart/form-data">
选择文件进行上传:<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form> <br/> <form action="${ctx}/uploadFileDemoCtrl/downLoadFile" method="get">
输入需要下载的文件名称:<input type="text" name="filename"/>
<input type="submit" value="下载"/>
</form> </body>
</html>
java 代码
/**
* 文件下载
* 有目录遍历攻击漏洞的代码
*/
@RequestMapping("/downLoadFile")
public void downLoadFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取项目部署绝对路径下的upload文件夹路径,下载upload目录下面的文件
String root = request.getServletContext().getRealPath("/upload");
//获取文件名
String filename = request.getParameter("filename");
File file = new File(root + "/" + filename);
//根据文件路径创建输入流
FileInputStream fis = new FileInputStream(file);
//设置响应头,弹出下载框
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
byte[] b = new byte[fis.available()];
fis.read(b);
response.getOutputStream().write(b);
}
运行,页面显示如下:
在输入框中输入文件名,即可下载 upload 文件夹下的文件。但是这里如果输入类似 “../WEB-INF/web.xml” 的文件名,则会下载 web.xml 文件,同理,很多文件都可以下载下来,包括一些配置文件,这就是目录遍历攻击。
解决方案
这里可以通过数据库存储文件信息,下载利用数据库 id 下载,同时后台传给前端使用加密形式来防止这个漏洞。
基于 java 【Web安全】文件上传漏洞及目录遍历攻击的更多相关文章
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- java web(四)文件上传与下载
一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...
- java+web+超大文件上传
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- Java Web(十一) 文件上传与下载
文件上传 上传的准备工作 表单method必须为post 提供file组件 设置form标签的enctype属性为multipart/form-data,如果没有设置enctype属性,浏览器是无法将 ...
- java web关于文件上传下载的总结
文件上传使用<form method="POST" enctype="multipart/form-data"> , 而不是默认的applica ...
- java+web+多级文件上传
文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- web安全之文件上传漏洞攻击与防范方法
一. 文件上传漏洞与WebShell的关系 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等.这种攻击方式是最为直接和有效 ...
- WEB安全性测试之文件上传漏洞
1.漏洞描述:文件上传漏洞,是指可以利用WEB上传一些特定的文件包含特定代码如(<?php phpnfo;?> 可以用于读取服务器配置信息.上传成功后可以点击) 上传漏洞是指用户上传了一个 ...
随机推荐
- java后台简单从腾讯云下载文件通知前端以附件的形式保存
腾讯云对象存储和阿里云差不多 这是我的配置 /** * 腾讯云client * @return COSClient */ public static COSClient getCOSClient() ...
- centos7安装配置sql server 2017 linux教程
一.安装教程 https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-docker https://docs.mic ...
- 手动抠下的wordpress登录页面样式
CSS文件 login.css body, html { height: 100%; margin: 0; padding: 0; } html[Attributes Style] { -webkit ...
- 【算法笔记】B1053 住房空置率
看了半天发现是题目理解错了,可能空置的里面观察期超过D则判定空置,而不是用电量低于e的天数超过D. code #include <bits/stdc++.h> using namespac ...
- tomcat startup.brt启动一闪而过
今天启动皕杰自带的tomcat的时候,直接点startup.brt控制台窗口一闪而过. 改用cmd命令启动: 切换到 E:\皕杰报表\皕杰报表3.5\DemoServer\bin目录 运行startu ...
- OpenERP how to set the tree view limit
return { 'name':u'库存报表', 'view_type':'form', 'view_mode':'tree,form', 'res_model':'rainsoft.account. ...
- 全面解析C#中参数传递
一.引言 对于一些初学者(包括工作几年的人在内)来说,有时候对于方法之间的参数传递的问题感觉比较困惑的,因为之前在面试的过程也经常遇到参数传递的基础面试题,这样的面试题主要考察的开发人员基础是否扎实, ...
- WCF系列教程之WCF中的会话
本文参考自http://www.cnblogs.com/wangweimutou/p/4516224.html,纯属读书笔记,加深记忆 一.WCF会话简介 1.在WCF应用程序中,回话将一组消息相互关 ...
- ubuntu apache2 .htaccess 下配置 反向代理
安装完apache2后, a2enmod rewrite //启用.htaccess规则 a2enmod proxy a2enmod proxy_http //启用反向代理支持 [P] 配置OK,就可 ...
- css中奇怪的地方
1.border-color 继承内部元素前景色(color:black.可能对元素本身没有效果) 2.border-style:none;//不仅样式没了,border-width也变为0 ...