漏洞解决方案-文件上传

  • 漏洞概述
  • 安全措施
    • 限制文件扩展名
    • 检查文件头格式
    • 文件内容检查
    • 随机命名文件
    • 非WEB目录存储
  • 代码参考

漏洞概述

非法的文件上传是黑客最常用的攻击手段之一,如果允许黑客向某个可通过 Web 访问的目录上传文件,并能够将这些文件传递给代码解释器,它会给正常的系统中执行恶意的代码文件(通常这种恶意代码叫做:WebShell),通过执行恶意的WebShell获取相应权限,来控制整个主机系统。

安全措施

限制文件扩展名

检查上传的文件扩展名是否为预期的扩展名文件,拒绝接收任何非预期的扩展名文件。

检查文件头格式

仅作文件扩展名检查,不足以识别一个文件的真正文件格式,可以进一步检查文件头,以识别上传文件的格式。不接收非预期文件头格式的文件。
常见文件的文件头(16进制,摘自百度百科,仅供参考)

JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD(dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML(html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express(dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel(xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave(wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio(ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG(mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime(mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI(mid),文件头:4D546864

注意:文件头是可篡改的。

文件内容检查

对于文件内容格式较为固定的情况,可就文件内容做检查,进一步确保上传文件的安全性,如上传文件内容格式不满足预期,则不予接收。

随机命名文件

将接收的文件随机重命名(此举对于需要回显文件的情况没有意义)。

非WEB目录存储

对于不需要回显文件的情况,可将接收的文件保存到非WEB发布目录下,这样可以保证,即使攻击者上传了WebShell,也不可以访问执行。

代码参考

参考代码功能:
1、通过上传文件的后缀名判断上传的文件类型是否合法
2、如果合法则在根据上传文件头信息进一步判断上传文件的合法性
3、最后随机重命名上传的文件名以保证上传文件的安全性

package com.unisguard.fileupload.controller;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.unisguard.fileupload.service.FileCheckService;@Controller
public class FileUploadController {@Autowiredprivate FileCheckService fileCheckService;@RequestMapping("/upload")public String handleFormUpload(HttpServletRequest request,MultipartHttpServletRequest multipartRequest,HttpServletResponse response,Model model) throws Exception {try {StringBuilder messages = new StringBuilder();Iterator<String> i = multipartRequest.getFileNames();while(i.hasNext()) {MultipartFile file = multipartRequest.getFile(i.next());if (!file.isEmpty()) {InputStream source = file.getInputStream();// 得到上传的文件的文件名String fileFullName = file.getOriginalFilename();// 检测文件大小boolean isValidFileSize = fileCheckService.checkFileSize(file);if(!isValidFileSize) {messages.append("文件[").append(fileFullName).append("]上传失败,原因:文件大小超过了10M!");continue;}// 通过文件名检测文件后缀boolean isValidFileExt = fileCheckService.checkFileExt(fileFullName);if(!isValidFileExt) {messages.append("文件[").append(fileFullName).append("]上传失败,原因:文件格式不允许!");continue;}// 通过文件头检测文件后缀isValidFileExt = fileCheckService.checkFileHeaderType(file);if(!isValidFileExt) {messages.append("文件[").append(fileFullName).append("]上传失败,原因:文件格式不允许,格式可能被篡改!");continue;}// 获取保存服务器的文件名String newFileName = fileCheckService.createNewFile(fileFullName);// 得到上传服务器的路径String pathname = new StringBuilder("D:/upload/").append(newFileName).toString();File destination = new File(pathname);// 文件流写到服务器端FileUtils.copyInputStreamToFile(source, destination);}}if(messages.length() != 0) {model.addAttribute("message", messages.toString());} else{model.addAttribute("message", "上传成功!");}} catch (IOException e) {e.printStackTrace();throw new Exception("上传出错!",e);}return "message";}}

关注公众号,一起分享实用安全技术,关注安全最新事件,记录工作常见问题,吐槽生活真心操蛋。

漏洞解决方案-文件上传相关推荐

  1. nginx 上传文件漏洞_文件上传及解析漏洞

    注:本文仅供学习参考 文件上传定义: 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等. 这种攻击方式是最为直接和有效的, ...

  2. 米斯特白帽培训讲义(v2)漏洞篇 文件上传

    米斯特白帽培训讲义 漏洞篇 文件上传 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 我们首先看一下文件上传的流程图. 其中,浏览器通过上传页面将文件储存到服务器中.一般这些 ...

  3. 米斯特白帽培训讲义 漏洞篇 文件上传

    米斯特白帽培训讲义 漏洞篇 文件上传 讲师:gh0stkey 整理:飞龙 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc- ...

  4. web漏洞之文件上传漏洞

    结合靶场对新手文件上传漏洞的测试时,遇到的一些问题的整理 文章目录 前言 一.文件上传漏洞是什么 二.工具介绍 1.中国蚁剑 2.读入数据 总结 前言 新手在进行文件上传时会遇到各种各样的问题,大佬别 ...

  5. 某OA ajax.do 未授权漏洞任意文件上传getshell复现

    某OA ajax.do 未授权漏洞任意文件上传getshell复现 0x00 简介 某OA A8 是一款流行的协同管理软件,在各中.大型企业机构中广泛使用. 由于某旧版本某些接口能被未授权访问,并且部 ...

  6. SQL注入、XSS、XXE、CSRF、SSRF、越权漏洞、文件上传、文件包含总结篇

    漏洞总结篇 SQL注入 什么是SQL注入? 怎么防御? 过滤特殊字符 修改php.in 使用mysqli_real_escape_string()函数 加固数据库方面 加固管理方面 Mybatis 防 ...

  7. php 上传文件漏洞,【文件上传】PHP文件上传漏洞

    0x01 文件上传漏洞 文件上传漏洞顾名思义就是用户上传一个可执行的脚本文件,获得了执行服务器端命令的能力.通常,文件上传是getshell最常用.最直接的方式了.但是,文件上传本身是一个正常的业务需 ...

  8. php文件上传漏洞waf,文件上传绕过WAF

    文件上传 文件上传实质上还是客户端的POST请求,消息主体是一些上传信息.前端上传页面需要指定 enctype为multipart/from-data才能正常上传文件. 此处不讲各种中间件解析漏洞只列 ...

  9. java 文件上传漏洞_文件上传漏洞(绕过姿势)

    文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此 ...

最新文章

  1. VMware View Composer 虚拟机映像管理
  2. 判断数组中有该元素?
  3. 编写程序,删除数组中重复的元素,并统计各元素出现的次数
  4. mysql抽屉图标_React Native自定义组件实现抽屉菜单控件效果
  5. Google Reader 干掉了 RSS!
  6. 高斯消元解线性方程组(浮点高斯消元模板)
  7. D. Array Splitting
  8. 如何判断对象是否存活/死去
  9. SpringBoot在线预览PDF文件
  10. 自考软件工程常考简答题历年真题
  11. 国庆必看9大区块链电影!建议收藏!
  12. Original error: Error executing adbExec
  13. iOS 中的编码方式详解(主要讲解Unicode)
  14. 宝塔如何使用一个IP地址建立多个站点
  15. java ?: 三目运算符
  16. 如何高效的学习JAVA?
  17. C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design
  18. TP-link WR740N 升级版本备忘
  19. 山东大学软件学院2020-2021 软件工程考试纲要与考题回忆
  20. Unreal Engine中的UHT和UBT

热门文章

  1. Mysql主从同步记录
  2. 统计|如何理解线性回归分析中残差检验的基本步骤
  3. IP反查域名的方式方法汇总
  4. Android笔记:Dialog显示图片
  5. JavaPoet开源项目的使用
  6. 如何绘制UML用例图
  7. 为何有些文献查不到DOI?
  8. MySQL 乱七八糟的可重复读隔离级别实现
  9. Codeforces ~ 1063C ~ Dwarves, Hats and Extrasensory Abilities (交互题,二分)
  10. Python语言基础快速入门