【问题标题】:How to find out whether a zipped file contains executable files如何找出压缩文件是否包含可执行文件
【发布时间】:2015-07-23 21:45:37
【问题描述】:

我需要使用我的 Java - Spring Web 应用程序上传文件。

在向 Web 应用程序上传文件时,我需要检查要上传的文件类型。根据我的要求,我需要允许上传压缩文件。

为了解决安全问题,如果我有恶意文件类型列表,则应筛选 zip 文件中的可执行文件或不需要的文件类型。

请建议我如何使用 java 知道 zip 中文件的内容类型。

【问题讨论】:

标签: java spring security file-type


【解决方案1】:

我建议尝试以下方法:

  1. 使用 Zip 文件系统提供程序通过 NIO.2 文件 API 访问 ZIP 文件:https://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html
  2. 遍历文件树:https://docs.oracle.com/javase/tutorial/essential/io/walk.html(也有支持 Java SE 8 Streams 的方法)。
  3. 执行检查,例如。使用Files.isExecutable

【讨论】:

    【解决方案2】:

    您主要关心的是找到一个 zip 文件是否包含files。为此,您可以搜索 zip 文件的内容以读取文件名;从文件名中您可以找到哪个文件是 文件。

    public static void printFileList(String filePath){
    
        FileInputStream fis = null;
        ZipInputStream zipIs = null;
        ZipEntry zEntry = null;
        try {
            fis = new FileInputStream(filePath);
            zipIs = new ZipInputStream(new BufferedInputStream(fis));
            while((zEntry = zipIs.getNextEntry()) != null){
                System.out.println(zEntry.getName());
            }
            zipIs.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    输入

    C:\\Users\\Desktop\\New.zip
    

    输出

    New/contactsManager
    New/log.txt
    New/timesheet.PNG
    

    您可以从输出文件名中找到 .exe 文件。

    【讨论】:

      【解决方案3】:

      首先,您需要重写文件。 Zip 文件“令人惊讶”。阅读内容,检查,写入新档案。这并不罕见,并且进一步重写包含的文件(例如,网站通常会重写用户上传的图像)。

      您应该注意目录遍历攻击和拒绝服务(zip 炸弹)的其他事项。

      通常您应该将其列入白名单,而不是列入黑名单。可能您想检查文件扩展名(并可能检查是否没有更多的点)和幻数(通常是前四个字节)是否一致。 UNIX 命令魔法的实现可能会对您有所帮助。

      有一些特殊性。例如 zip 文件本身可以从后面读取(参见 GIFAR)。有些程序会忽略无效输入并跳到它可以理解的内容。目标程序可能会做一层额外的解包,比如 gunzip。

      【讨论】:

      • 是的,我想加入白名单,而不是黑名单。我无法单独检查文件扩展名,可能存在扩展名更改的文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多