`
dawuafang
  • 浏览: 1104901 次
文章分类
社区版块
存档分类
最新评论

shiro安全框架扩展教程--上传文件的安全控制

 
阅读更多

相信每一个项目都会存在文件上传功能,最常见的就是图片,音频,视频等上传,但是如果用户多的应用都会存在用户恶意上传动作,包括伪装成可上传文件,

按照我们以往的方式,普通地判断后缀名,那是不可行,除了一些内部系统可以这样简单的玩耍,那对外的互联网应用项目是不够严格的


下面举例个简单的攻击


1. 我们的上传代码中只判断了,request里面的文件类型

2. 恶意用户把一个jsp文件,修改了头文件信息,这样就可以骗过浏览器上传过程中是显示文件是image/jpeg

3. 然后文件就可以直接保存成功了,很明显这是由于服务端判断不严谨导致的,用户访问xxxx路径下的上传jsp文件然后就可以执行jsp里面的脚本,你的资料基本就泄漏的差不多了


然后下面如果说是加个后缀名判断,也差不多可以这样绕过


我们都知道文件都有所谓的文件头信息,但是除了jsp,txt等一些特殊的是没有固定的,所以我们要排除这些


下面看看一些常用的文件头信息匹配


                fileHeaderType.put(".jpg", "FFD8FF"); // JPEG (jpg)
		fileHeaderType.put(".png", "89504E47"); // PNG (png)
		fileHeaderType.put(".gif", "47494638"); // GIF (gif)
		fileHeaderType.put(".tif", "49492A00"); // TIFF (tif)
		fileHeaderType.put(".bmp", "424D"); // Windows Bitmap (bmp)
		
		fileHeaderType.put(".zip", "504B0304");
		fileHeaderType.put(".rar", "52617221");
		fileHeaderType.put(".7z", "377abcaf");
		
		fileHeaderType.put(".xls", "D0CF11E0");
		fileHeaderType.put(".xlsx", "504b030414");
		fileHeaderType.put(".doc", "D0CF11E0"); 
		fileHeaderType.put(".docx", "504b0304"); 
		
		fileHeaderType.put(".dwg", "41433130"); // CAD (dwg)
		fileHeaderType.put(".html", "68746D6C3E"); // HTML (html)
		fileHeaderType.put(".rtf", "7B5C727466"); // Rich Text Format (rtf)
		fileHeaderType.put(".xml", "3C3F786D6C");
		
		fileHeaderType.put(".psd", "38425053"); // Photoshop (psd)
		fileHeaderType.put(".eml", "44656C69766572792D646174653A"); // Email

		fileHeaderType.put(".dbx", "CFAD12FEC5FD746F"); // Outlook Express (dbx)
		fileHeaderType.put(".pst", "2142444E"); // Outlook (pst)
		
		fileHeaderType.put(".mdb", "5374616E64617264204A"); // MS Access (mdb)
		fileHeaderType.put(".wpd", "FF575043"); // WordPerfect (wpd)
		fileHeaderType.put(".eps", "252150532D41646F6265");
		fileHeaderType.put(".ps", "252150532D41646F6265");
		fileHeaderType.put(".pdf", "255044462D312E"); // Adobe Acrobat (pdf)
		fileHeaderType.put(".qdf", "AC9EBD8F"); // Quicken (qdf)
		fileHeaderType.put(".pwl", "E3828596"); // Windows Password (pwl)
		fileHeaderType.put(".wav", "57415645"); // Wave (wav)
		fileHeaderType.put(".avi", "41564920");
		fileHeaderType.put(".ram", "2E7261FD"); // Real Audio (ram)
		fileHeaderType.put(".rm", "2E524D46"); // Real Media (rm)
		fileHeaderType.put(".mpg", "000001BA"); //    
		fileHeaderType.put(".mov", "6D6F6F76"); // Quicktime (mov)
		fileHeaderType.put(".asf", "3026B2758E66CF11"); // Windows Media (asf)
		fileHeaderType.put(".mid", "4D546864"); // MIDI (mid)

如何使用呢?我们应该读取文件的前面一些字节,然后匹配这些固定的字符串,如果可以匹配上那证明是合法的


/** 获取文件头 */
	private static String getFileHeader(File file, int byteSize) throws IOException {

		InputStream in = new FileInputStream(file);

		byte[] b = new byte[byteSize];
		in.read(b, 0, b.length);

		if (b == null || b.length <= 0) {
			return null;
		}

		StringBuffer buffer = new StringBuffer();

		for (int i = 0, len = b.length; i < len; i++) {
			int v = b[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				buffer.append(0);
			}
			buffer.append(hv);
		}
		return buffer.toString().toLowerCase();
	}


然后使用对应的类型和对应的文件头信息匹配,但是有个比较麻烦的问题,如果图片把jpg后缀改成png,应该算是正常合法的,所以这个时候应该把当前后缀全部匹配下图片的魔数

如果找到一个合法则认为通过,这样处理应该是比较正确的


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    基于SpringBoot+Shiro+Redis+Jwt+Thymeleaf+MyBatis 开发的后台用户、角色+源代码+文档

    Geek-Framework是在SpringBoot基础上搭建的一个Java基础开发框架,以Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro和Spring-Security为权限授权层,redis进行缓存。 Geek-Framework主要定位于微...

    基于 springboot、ant-design-vue 的开源框架+源代码+文档说明

    角色的功能权限控制方式为基于RBAC规范的Shiro,角色数据范围控制是根据用户的所属机构、数据的创建者(用户ID)实现。项目支持前端菜单动态路由。前后端交互使用JWT验证权限,使用Redis调用lua脚本CAS的方式,并且在...

    单点登录源码

    Apache Shiro | 安全框架 | [http://shiro.apache.org/](http://shiro.apache.org/) Spring session | 分布式Session管理 | [http://projects.spring.io/spring-session/]...

    JavaWeb后台开发框架-其他

    同时,框架提供长大量常规组件,如上传单图、上传多图、上传文件、下拉选择、复选框按钮、单选按钮,城市选择、富文本编辑器、权限颗粒度控制等高频使用的组件,代码简介,使用方便,节省了大量重复性的劳动,降低...

    SpringBoot 文件上传下载

    自己定义资源网站,实现上传和下载文件 使用shiro 控制权限,想要学习shiro的同学也可以下载下来 数据库使用MySQL 框架使用mybatis 前端界面使用layui,感兴趣的同学可以对前端界面进行优化 源代码比较容易理解,在...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 mysql版本_spring3.0

    加入安全框架 shiro (登录授权)(session管理) 11.根据汉字 解析汉字的全拼(拼音)和首字母(导入excel到用户表,根据用户的汉字姓名生成拼音的用户名) 12.app接口(支持与其它语言数据交互) 12.极光推送 (推送给APP...

    CMS轻量级系统

    安全框架:Apache Shiro 1.3.2 视图框架:Spring MVC 4.2.5.RELEASE 数据库连接池:Tomcat JDBC 缓存框架:Ehcache ORM框架:Spring Data JPA、hibernate 4.3.5.Final 日志管理:SLF4J 1.7.21、Log4j ...

    finance-master汇尚电子商务商品管理系统.zip

    Shiro 简单而强大的安全框架。 DWZ富客户端框架 简单易学、方便扩展的富客户端框架。 Ehcache 缓存支持。 ? 3)?项目优势 a.?项目构建简单、架构清晰,可快速定制页面与编写服务端代码。 b.?提供代码生成器,只需创建...

    jeesite源码

    (注:由于jar文件较大,需要jar请免费下载本人上传的lib.jar文件) JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的**开源**Java EE快速开发平台。 JeeSite本身是以Spring Framework为...

    goja-doc:Goja 文件

    Gaja 介绍Goja是在 框架的基础上,以及 的扩展补充,同时参考Play 1.2系列的方式, 以COC(约定纪配置)的原则,在各个项目的开发中对使用场景的不断积累的一个快速、高效的web开发框架。主要特点如下:在 JFinal基础...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 oracle版本_spring3.0

    加入安全框架 shiro (登录授权)(session管理) 11.根据汉字 解析汉字的全拼(拼音)和首字母(导入excel到用户表,根据用户的汉字姓名生成拼音的用户名) 12.app接口(支持与其它语言数据交互) 12.极光推送 (推送给APP...

    xmljava系统源码-app:基于SpringMVC、Hibernate、Redis、Shiro、JqueryEasyUI的J2EE快速开发

    xml java系统源码 J2EE快速开发框架 ...简单的文件服务模块,使用FTP服务器上传和下载 app-generator 代码生成器 app-log 通用日志模块 app-system 通用的系统管理模块 app-utils 一些通用的工具类 技术选型 核心

    iBase4J分布式系统-其他

    技术选型:核心框架:Sring boot + Spring Framework + Dubbo + ibase4j-common安全框架:Apache Shiro任务调度:Spring + Quartz持久层框架:MyBatis + MyBatis-Plus数据库连接池:Alibaba Druid缓存框架:Redis...

    Jspxcms网站内容管理系统 源码包 v9.0.0.zip

    Jspxcms是基于Java、JSP技术开发的国产开源CMS,是制作、维护...Shiro安全框架;Lucene近实时检索;Freemarker模板技术;仿Gmail验证码等。 Jspxcms网站内容管理系统页面截图展示  相关阅读 同类推荐:CMS系统

    javapms门户网站源码

    系统选用了经过java社区长时间使用,被证明稳定、可靠、安全、高性能的开源框架,包括Spring、Hibernate、Freemarker、jQuery、Shiro等框架。使用这些框架可以使软件开发更加高效、易于维护,而且具有更好的性能、更...

Global site tag (gtag.js) - Google Analytics