拉链

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

null

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

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

考虑您的应用程序接受包含候选人个人/学术细节的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” 可能会读取usr1无权访问的目录/usr3的文件。这会导致敏感数据泄露。

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

在代码的第3行,我们使用 文件名 删除文件夹 没有任何验证。我们应该验证这些变量值,并且/或者应该检查zFile是否是我们授予写访问权的适当目录,如果缺少该目录,应用程序将很容易受到ZIP-Slip攻击。

在最糟糕的情况下,当用户能够以远程方式执行命令或shell脚本时,这甚至可能导致远程访问/代码执行。使用此攻击,攻击者可以访问文件系统中预期/特权文件夹之外的特定目录/文件夹,并可以调用/覆盖文件。

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

可能的解决方案

  1. 强制用户使用标准名称命名文件。
  2. 去除文件名中的特殊字符。
  3. 将文件名与标准正则表达式进行匹配和比较。
  4. 在实际使用/存储文件之前,使用生成的名称重命名上传的zip中的所有文件
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享