📜  邮编

📅  最后修改于: 2021-04-16 09:22:03             🧑  作者: Mango

许多Web应用程序允许用户以压缩格式(通常是zip文件格式)提交文件,以减小正在上传的文件的大小。稍后,应用程序将解压缩压缩的文件并获取zip中的实际文件。

ZIP Slip是针对此类应用程序的高度关键的安全漏洞。 ZIP Slip使您的应用程序容易受到路径遍历攻击和敏感数据泄露的攻击。

[/root]
                                          /   |    \
                                   [/usr1] [/usr2] [/usr3]
                                      |               |
                                 [details.zip]    [details.zip]
                                     /               \
                     [resume.doc][marksheet.pdf] [resume.doc][marksheet.pdf]
  

考虑您的应用程序接受包含候选人的个人/学术详细信息的zip文件,并自动为用户填写申请表。理想情况下,应用程序应该解压缩压缩文件,逐个读取zip文件,从文件中提取有意义的信息,最后用相应的数据自动填写表格。

这是借助下面的代码片段完成的,

while ((entry = zIn.getNextEntry()) != null) {
    String fileName = entry.getName();
    File zFile = new File(destFolder + File.separator + fileName);
    InputStream input = zip.getInputStream(entry);
    // Write the file content
}

如果应用程序未验证上载zip中的文件名,则容易受到ZIPSlip攻击。用户可以上载带有特制文件名的zip。在这种情况下,带有文件名的zip
“ ../usr3/resume.doc”可能会读取/ usr3目录,而usr1没有访问权限。这导致敏感数据暴露。

这是因为在基于Unix的系统上, .. /在目录结构中被视为上一级。

在代码的第3行,我们使用fileNamedestFolder进行了简单的追加操作,而没有进行任何验证。我们应该已经验证了这些变量值和/或应该检查zFile是否是我们授予写访问权限的适当目录,而缺少该应用程序容易受到ZIP Slip攻击的地方。

在最坏的情况下,当用户能够以远程方式执行命令或shell脚本时,这甚至可能导致远程访问/代码执行。使用此攻击,攻击者可以获得对目标/特权文件夹外部文件系统中某些目录/文件夹的访问权,并且可以调用/覆盖文件。

攻击者甚至不必知道您的目录结构,因为可以读取来自tomcat / apache的关键系统文件(例如etc / passwd etc / hosts),因为它们遵循相同的目录结构。

可能的解决方案

  1. 强制用户使用标准名称命名文件。
  2. 删除文件名中的特殊字符。
  3. 将文件名与标准正则表达式进行匹配和比较。
  4. 在实际使用/存储文件之前,使用生成的名称重命名上载zip中的所有文件