【上传专题】仅前端过滤

在论坛等平台中,上传各种附件是必不可少的功能,往往也是黑客们容易攻击的地方。在上传专题中,与大家分享一些关于如何破解上传,以及如何防御,通过两者的博弈方式,体现出上传附件攻防的微妙之处。

1. 概述

本文介绍前端过滤上传附件扩展名,如何使用burosuite绕过前端过滤,上传非法文件。

2. 前提条件

1)burpsuite工具;

2)apache commons fileupload 相关jar包;

3. 前端代码示例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP ‘index.jsp‘ starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<script type="text/javascript">
		// submit upload form
		function upload() {
			// 获取上传文件名
			var filename = document.getElementById("filename").value;
			// 判断上传文件是否是jpg扩展名,如果是那么提交表单,否则提示用户上传文件非法
			if (filename.lastIndexOf(".jpg") != -1) {
				document.forms[0].action = "upload.do";
				document.forms[0].submit();
			}else {
				alert("Only jpg ");
				window.open(window.location.href, _self);
			}
		}
	</script>

  </head>
  
  <body>
   	<form  enctype="multipart/form-data" method="post">
   		fileDesc : <input type="text"  name="fileDesc" id="fileDesc"><br/> 
   		fileupload : <input type="file"  name="filename" id="filename"><br/>
   		<input type="submit" value="Upload" onclick="upload();"> 
   	</form>
   
  </body>
</html>

4. 后台上传处理代码示例

package com.fileupload.servlets;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
 * 文件上传
 * @author wangzp
 *
 */
public class UploadServlet extends HttpServlet {

	/**  内存容量阀值 **/
	private final int sizeThreshold = 1024 * 1024 * 2;

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 判断是否是multipart/form-data请求
		boolean isMultipartRequest = ServletFileUpload.isMultipartContent(request);

		if (!isMultipartRequest) {
			response.getWriter().print("Invalid Request");
			return;
		}

		String tmpPath = this.getServletContext().getRealPath("/images");
		DiskFileItemFactory factory = new DiskFileItemFactory(sizeThreshold, new File(tmpPath));

		ServletFileUpload fileUpload = new ServletFileUpload(factory);
		fileUpload.setFileSizeMax(1024 * 1024 * 5); // 单个上传文件的大小上限
		fileUpload.setSizeMax(1024 * 1024 * 5);       // 一次请求字节大小上限
		fileUpload.setHeaderEncoding("utf-8");     // 设置请求头编码

		try {
			// 解析请求返回表单字段域对应的FileItem列表;每一个表单字段对应一个FileItem实例
			List<FileItem> fileItems = fileUpload.parseRequest(request);

			for (FileItem fileItem : fileItems) {

				//  获取表单字段的name属性
				String fieldName = fileItem.getFieldName();
				// 获取上传文件的文件名,如果是非上传文件字段,那么该值为null;
				String name = fileItem.getName();
				// 获取字段对应的值
				String value = fileItem.getString();
				// 如果是上传字段,那么会获取ContentType类型,非上传字段返回null;
				System.out.println(fileItem.getContentType());

				if (fileItem.isFormField()) { // true : 非上传字段

					response.getWriter().println(fieldName + " : " + value);

				}else {  //如果是文件上传字段
					System.out.println("fieldName : " + fieldName);
					System.out.println("name:" + name);

					File file = new File(tmpPath + "/" + name);
					if (!file.getParentFile().exists()) {
						file.getParentFile().mkdir();
					}
					fileItem.write(file); 
				}
			}

		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

5.结果分析以及如何绕过前端过滤

当上传.jpg图片时,可以成功上传文件,当选择其他文件时,前端会提示上传文件类型不正确;那么如何才能绕过前端的过程呢?如果对拦截工具有些了解的话,这是很简单的事情,可以采取如下方式:

1)修改文件扩展名,例如:原文件为test.png,将其修改为test.png.jpg;这时前端就可以验证成功,即可以顺利的出发表单提交;

2)使用burpsuite拦截文件上传请求,如下图:

    在修改后,可以让其提交到到服务器,你会发现服务器成功上传了redis.png图片。

6. 总结

这只是一个简单的例子,现在的开发网站不大会这么简单就可以绕过的,关于更加复杂的问题,会 在后续的文章中,逐一介绍。

作为后端开发人员,不应该去依赖前端的代码控制,因为暴露给用户的代码,不会是安全的;那往往是一种用户体验的措施,因此面对这样的情况,后端应该也做足功课,对上传文件的信息过滤处理;尽可能的防止上传非法文件,如果让其上传了非法文件,对方极有可能获取WebShell,或者一些其他恶意的操作。这一系列的文章,重点是讲述如何使用上传组件,以及如何防御非法上传。在下一篇文章中,将介绍如何后端代码过滤扩展名,以及相应的问题。

时间: 2024-10-09 19:32:05

【上传专题】仅前端过滤的相关文章

【上传专题】服务器端过滤及其绕过方式

上一篇文章,讲述了如何绕过前端文件类型. 详情见:http://793404905.blog.51cto.com/6179428/1566743 1.引言 这一篇讲述一些常见的服务端过滤方式,以及各种过滤方式存在的隐患.并给出怎样处理服务端和前端过滤,以达到更加安全的上传机制. 2.本文大纲 1)Content-Type(Mime Type)检测过滤,以及如何绕过: 2)文件扩展名检测: 3)文件头检测: 4)文件加载检测. 3.Content-Type 检测过滤 按照正常的上传方式,会根据上传

微信公众平台新增图文内容中图片上传接口,并过滤外链图片(这是封闭么?)

为了加快图文内容的浏览速度,公众平台新增了图文消息内容中的图片上传接口.开发者可以通过该接口上传所需要的图片来获得图片链接,再把图片链接放到图文内容中. 同时,为了加强平台安全性,从8月15日起, 系统将自动过滤图文内容中的外链图片(8月15日之前的图文内容不会过滤).下述接口受到影响,请开发者尽快修改: 1.群发图文消息时,上传图文的接口,查看接口文档 2.素材管理中的新增永久图文素材接口,查看接口文档

CANVAS运用-对图片的压缩上传(仅针对移动浏览器)

最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等)上传时间过长会导致上传失败,而每次都上传原始大小的图片(后台处理压缩)十分影响用户体验,所以研究了一下通过canvas压缩图片并上传的方法,以下是整理的一些思路和心得: 一.<input type="file">获取本地图片,并将图片绘制到画布中.此处的难点在于:由于浏览器的

springBoot 连接打包成jar包运行时,获取图片上传文件、前端调用图片显示

配置文件在application.properties中进行配置 web.upload-path=d:/myfile/uploadweb.front-path=d:/myfile/frontspring.resources.static-locations=file:${web.upload-path},file:${web.front-path} application.yml配置方式 web:  upload-path: d:/myfile/upload  front-path: d:/my

bug 修复:上传库存时前端回发file_name参数丢失;

# tmp_file = os.path.join(os.path.abspath('youcart/tmp'), json.loads(request.data).get('file_name')) tmp_file = os.path.join(os.path.abspath('youcart/tmp'), request.form.get('file_name'))

js截取图片上传(仅原理)----闲的无聊了代码就不共享了!写的难看,不好意思给你们看了(囧)

就算世界再坑爹,总有一些属性能带你走出绝望(伟大的absolute) 今天吐槽一下!......在我的世界里没有正统UI,所以效果图永远都是那么坑爹! 这里我要感谢有个position:absolute;   T_T 当遇到各种不合理布局的时候,至少还有它 吐槽完毕!!! 这个就是一个简单的图片截取工具!!简陋了点我承认 首先第一步,没什么大问题,解析图片格式 图片么无非就是png,jpg,gif多余的统统alert框叫他们换 第二步么也没什么奇怪难度,就无非设置鼠标形状 第三步么还是没什么难度

html5表单上传控件Files筛选指定格式的文件:accept属性过滤excel文件

摘自:http://blog.csdn.net/jyy_12/article/details/9851349 (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:<input type="file" multiple> 只允许上传一个文件:<input  type="file" single> 2.上传指定的文件格式 <input type="file" acce

HTML5 file API加canvas实现图片前端JS压缩并上传 (转载)

一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险. 最最重要的体验改进点:省略了图片的再加工成本.很多网站的图片上传功能都会对图片的大小进行限制,尤其是头像上传,限制5M或者2M以内是非常常见的.然后现在的数码设备拍摄功能都非常出众,一张原始图片超过2M几乎是标配,此时如果用户想把手机或相机中的某个得意图片

前端之HTML利用XMLHttpRequest()和FormData()进行大文件分段上传

用于网页向后端上传大文件 ### 前端代码<body> <input type="file" name="video" id="file" /> <input type="button" class="btn btn-info" id="sub" value="提交"> <script> $("#sub&quo