当前位置: 首页 > news >正文

代码审计——任意文件下载详解(二)

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓

    • 01 漏洞描述
    • 02 审计要点
    • 03 漏洞特征
    • 04 漏洞案例
    • 05 修复方案

01 漏洞描述


网站可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件,可以是源文件,敏感文件等等。

在这里插入图片描述

02 审计要点


任意文件下载漏洞发生的根本原因是系统自带的查看或下载功能,用户可控制下载路径,且当服务器不做任何限制的时候,就可以完成对任意文件的读取/下载。

当判断代码中是否存在任意文件下载漏洞时,可从以下3点进行判断:

1、是否存在文件读取接口?Java中如read函数等。

2、待读取的文件名参数是否为用户可控?是否直接拼接http请求数据?或者调用存储在数据库中的数据?

3、用户输入的文件名是否经过了校验?是否预先设置好文件白名单?对输入的特殊字符是否存在敏感字符过滤?

03 漏洞特征


如果存在文件下载接口,且该接口接受用户输入的文件名作为将要下载的文件资源,且对文件资源名字没有进行路径和文件名字的校验,则存在该漏洞。

Java

private final String PROFILE = "F:\\file\\";@RequestMapping("/download1")
public void download1(String filename, HttpServletResponse response) {try {String fileaPath = PROFILE + filename;File file = new File(fileaPath);> 这里是引用String fullfilename = file.getName();String ext = fullfilename.substring(fullfilename.lastIndexOf(".") + 1).toLowerCase();FileInputStream fileInputStream = new FileInputStream(file);InputStream fis = new BufferedInputStream(fileInputStream);byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();response.reset();response.setCharacterEncoding("UTF-8");response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fullfilename, "UTF-8"));response.addHeader("Content-Length", "" + file.length());OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");outputStream.write(buffer);outputStream.flush();} catch (IOException ex) {ex.printStackTrace();}
}

上述代码中,对前端传的filename参数直接进行路径拼接,且未对filename中特殊字符进行过滤,存在任意文件下载漏洞。

04 漏洞案例

在这里插入图片描述

打开源码文件,检索到file接口,明确里面的参数p没有过滤
在这里插入图片描述
在这里插入图片描述
而file接口却对p参数做了处理,跟进getFile,直接下载没有过滤,所以判断file/sm接口存在任意文件下载
在这里插入图片描述

05 修复方案


1、输入验证和过滤:确保对用户提供的输入进行有效验证和过滤,防止输入中包含恶意路径或文件名。

2、文件权限设置:禁止应用程序下载目录以外的文件,或者对某些文件设置只读权限。

3、白名单校验:限制文件下载的路径和文件类型,严格控制下载的文件范围。

4、文件名重写:对用户提供的文件名进行重写,防止用户通过修改文件名绕过限制。

5、使用安全框架:使用已经经过安全验证的框架进行文件下载操作,避免自行编写下载代码可能引入漏洞。

http://www.lryc.cn/news/171269.html

相关文章:

  • 19异常的学习笔记
  • Jenkins学习笔记4
  • 自学 Java 需要具备哪些基本条件或技能?
  • [激光原理与应用-68]:如何消除50Hz工频干扰和差分信号应对工频干扰
  • 【力扣-每日一题】LCP 06. 拿硬币
  • 【JAVA-Day32】精通Java函数:定义、调用和主函数的完整指南
  • springboot相关操作学习汇总
  • 如何在微信上制作自己的小程序卖东西
  • 24.Xaml ListView控件-----显示数据
  • YoloV5改进实战:使用MPDIoU改进YoloV5
  • 从电大搜题到上海开放大学,广播电视大学引领学习新风尚
  • DC/DC开关电源学习笔记(九)Buck降压拓扑原理
  • 【浏览器】主流浏览器伪元素一览
  • 国内首个潮玩行业沉浸式IP主题乐园,泡泡玛特城市乐园即将开园
  • 编译工具:CMake(八) | cmake 常用指令
  • 什么是GPT磁盘?介绍GPT(GUID 分区表)磁盘及其优势!
  • 直播视频处理过程
  • CGI与FastCGI的区别在哪里,FastCGI的应用场景讲解
  • 记录selenium和chrome使用socks代理打开网页以及查看selenium的版本
  • 2023 年最新 Docker 容器技术基础详细教程(更新中)
  • 初学phar反序列化
  • 嵌入式web项目框架解读
  • MySQL什么情况下会死锁,发生了死锁怎么处理呢?
  • 数字孪生行业相关政策梳理--智慧水利领域相关政策(可下载)
  • SQL plus简单使用
  • pnpm入门教程
  • JADE盲分离算法仿真
  • CMake教程-第 1 步:基本起点
  • Linux 或者 Docker 容器通过 date 设置系统时间
  • Docker 容器中运行 Kibana