首页 > 编程语言 >Java 任意文件下载漏洞

Java 任意文件下载漏洞

时间:2022-11-28 18:13:17浏览次数:40  
标签:resource fileName return 漏洞 PREFIX ResponseEntity PATH Java 任意

我们在开发 Web 应用时,经常会提供文件下载功能。对外暴露类似如下的URL

http://demo.com/download?fileName=foo.txt

这样的确很方便,但是,大家有没有想过,这样的功能可能会出现什么样的安全隐患或者漏洞呢?

下面是一段提供文件下载的spring mvc的java代码,使用fileName来指定要下载的文件。

    @GetMapping("/download")
    public ResponseEntity<Resource> download(@RequestParam("fileName") String fileName)
            throws IOException {

        Path filePath = Paths.get(PATH_PREFIX).toAbsolutePath().normalize()
                .resolve(fileName).normalize();
        Resource resource = new UrlResource(filePath.toUri());
        if (!resource.exists()) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + resource.getFilename())
                .body(resource);
    }

这里定了一个 PATH_PREFIX 常量,意图把访问限制在 PATH_PREFIX下。当fileName=../path/to/file 就跳出了限制,可以任意下载服务器上的问题,这是很严重的问题。

如果你的 DB 和业务代码配置在同一个服务器就可能被人脱库。

那么怎么解决这个问题呢?方案也有很多,例如:把文件路径存储到DB,客户端通过 fileId 下载文件。这里咱们讨论另一种简单的方案:

    @GetMapping("/download")
    public ResponseEntity<Resource> download(@RequestParam("fileName") String fileName)
            throws IOException {

        Path filePath = Paths.get(PATH_PREFIX).toAbsolutePath().normalize()
                .resolve(fileName).normalize();

        final String parentPathString = filePath.getParent().toAbsolutePath().toString();
        if (!parentPathString.startsWith(PATH_PREFIX)) {
            logger.error("illegal access!");
            return ResponseEntity.notFound().build();
        }

        Resource resource = new UrlResource(filePath.toUri());
        if (!resource.exists()) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + resource.getFilename())
                .body(resource);
    }

上面红色标记部分,判断需要下载的文件的路径是否包含了PATH_PREFIX,包含则合法。注意前面经过了 normalize 处理。

标签:resource,fileName,return,漏洞,PREFIX,ResponseEntity,PATH,Java,任意
From: https://www.cnblogs.com/xxoome/p/16932926.html

相关文章

  • java 验证邮箱格式正确性、验证字符串是否为数字
    java验证邮箱格式正确性 importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassRegisterCheck{   /**    *验证输入的邮箱格式是......
  • Java生成二维码,基于QRCode
    packagetest;importjava.io.*;importjava.util.Date;importjava.awt.*;importjava.awt.image.*;importjavax.imageio.*;importcom.swetake.util.Qrcode;publicclass......
  • 一个GUI的简单练习-------- Java记事本 简单实现 陆续完善中……
    packagejavanotpad;publicclassMainFrame{/***@paramargs*authorjavaAlpha*时间:2009年5月8日20:00:50*java记事本*/publicstaticvoidmain(Strin......
  • JavaScript动态生成制定行数,列数,并制定表头的表格
    JavaScript动态生成制定行数,列数,并制定表头的表格<html><head><scriptlanguage="javascript">vartable_head=newArray("用户名","MAC地址","用户类型");varcol_wi......
  • Java 读取文件
    由于项目的需要,需要写一个解析文件的类。importjava.io.EOFException;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.net.URL;importjava.ut......
  • java.lang.OutOfMemoryError: Java heap space读取文件时出现这个异常
    exceptionorg.apache.jasper.JasperException:javax.servlet.ServletException:java.lang.OutOfMemoryError:Javaheapspaceorg.apache.jasper.servlet.JspServletW......
  • java征程
    疫情三年,生活压力巨大,各个企业面临裁员,团队成本开销巨大,为了稳固发展,只能精简人员,节约成本,故此,很多项目的运维与开发只能亲自上阵,故,重新学习java,再次充实自己,后续会逐步更......
  • java 连连看,正在完善中……
    packageguiGame;importjavax.swing.JFrame;importjavax.swing.SwingUtilities;publicclassGameMain{/***@paramargs*连连看游戏,Java版*/publi......
  • javascript常用技巧
    javascript常用技巧事件源对象event.srcElement.tagNameevent.srcElement.type捕获释放event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件......
  • 对c#和Java的评述
    自C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍。抛却Microsoft与Sun之间的恩怨与口角,客观地从技术上讲,C#与Java都是对传统面向对象程序设计在组件化软件时代的革......