许多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行,我们使用fileName和destFolder进行了简单的追加操作,而没有进行任何验证。我们应该已经验证了这些变量值和/或应该检查zFile是否是我们授予写访问权限的适当目录,而缺少该应用程序容易受到ZIP Slip攻击的地方。
在最坏的情况下,当用户能够以远程方式执行命令或shell脚本时,这甚至可能导致远程访问/代码执行。使用此攻击,攻击者可以获得对目标/特权文件夹外部文件系统中某些目录/文件夹的访问权,并且可以调用/覆盖文件。
攻击者甚至不必知道您的目录结构,因为可以读取来自tomcat / apache的关键系统文件(例如etc / passwd etc / hosts),因为它们遵循相同的目录结构。
可能的解决方案
- 强制用户使用标准名称命名文件。
- 删除文件名中的特殊字符。
- 将文件名与标准正则表达式进行匹配和比较。
- 在实际使用/存储文件之前,使用生成的名称重命名上载zip中的所有文件