许多web应用程序允许用户以压缩格式(通常是zip文件格式)提交文件,以减小正在上载的文件的大小。稍后,应用程序将解压缩压缩文件,并返回zip中的实际文件。
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中的关键系统文件,因为它们遵循相同的目录结构。
可能的解决方案
- 强制用户使用标准名称命名文件。
- 去除文件名中的特殊字符。
- 将文件名与标准正则表达式进行匹配和比较。
- 在实际使用/存储文件之前,使用生成的名称重命名上传的zip中的所有文件