基于 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;?> 可以用于读取服务器配置信息.上传成功后可以点击) 上传漏洞是指用户上传了一个 ...
随机推荐
- leetcode 198 打家劫舍 Python 动态规划
打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...
- C++多线程编程二
1. 死锁与解锁: #include <iostream> #include <thread> #include <mutex> using namespace s ...
- TX2 之tensorflow环境部署
刷机jetpack3.3 首先TX2必须是3.3版本的jetpack,因为截止目前nvidia发布的tensorflow只支持3.3版本的jetpack,刷机的具体步骤可以参考NVIDIA Jetso ...
- PHP中filesystem的使用
PHP中filesystem的使用 最近在用腾讯云COS上传对象的时候,涉及到文件流的使用 参考文档:https://cloud.tencent.com/document/product/436/12 ...
- 【性能压测】:MQ队列异步处理机制导致的系统无法接受请求的问题
一,最近压测系统交易峰值时,因该支交易采用MQ异步队列处理机制:该增加积分的交易,前段服务器优先返回给客户增加积分成功的结果,后端的MQ队列服务器再慢慢处理该请求: 二,压测过程中出现的问题现象:前几 ...
- Android之build.prop属性详解
注:本篇文章是基于MSD648项目(AndroidTV)的prop进行说明. Android版本:4.4.4 内核版本:3.10.86 1.生成build.prop build.prop的生成是由ma ...
- Linux快速查看某条命令的版本和存放的位置(ls -l `which mvn`)
输入: ls -l `which mvn` 如图:
- typescript 入门
为什么要使用typescript? 出现拼写错误,可以立即指出错误. 出现模块引入错误,立即指出错误. 出现函数.变量类型错误,立即指出错误. 在react组件中制定好了基本的props和state之 ...
- spring boot快速入门 4: jpa数据库操作 实现增删改查
spring boot jpa逆向生成表 简单实例: 第一步:pom文件: <?xml version="1.0" encoding="UTF-8"?&g ...
- SSM的XML和WEB.XML的配置
显示层(handler/controller): request请求到springmvc的前端控制器,从处理器映射器找相应的handler(用@RequestMapping(" " ...