Hutool任意文件覆盖漏洞分析

1.漏洞相关信息

漏洞名称:Hutool任意文件覆盖漏洞

漏洞编号:CVE-2018-17297

漏洞描述:攻击者可以恶意构造Zip压缩文件,通过路径遍历覆盖任意文件,是“任意文件覆盖”和“目录遍历”问题的结合,攻击者可以将文件解压缩到正常解压缩路径之外并覆盖敏感文件

漏洞原理:zipEntry.getName()创建新文件时未做校验,如果攻击者通过上传目录中带有../的恶意zip文件,即可c穿越路径覆盖文件

2.环境搭建

Libraries:

1
2
3
4
5
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.11</version>
</dependency>

ZipController.java

1
2
3
4
5
6
7
8
9
package com.vulnerability.controller;

import cn.hutool.core.util.ZipUtil;

public class ZipController {
public static void main(String[] args) {
ZipUtil.unzip("/Users/sqyy/Desktop/password.zip","../../test/");
}
}

3.漏洞分析

hutool-all-4.1.11.jar!cn/hutool/core/util/ZipUtil.class

我们可以看到unzip这个函数分别有三个参数,分别代表

  • zipFile:表示需要解压的压缩文件
  • outFile:压缩文件解压到的目录
  • charset:表示编码的格式

而在第204行可以看到解压的目录在创建时,文件名是直接使用的zipEntry.getName(),没有进行校验,那么我们的zip文件可以包含../等目录穿越字符

此问题和Spring Integration Zip不安全解压漏洞相似,可以参考https://www.sqyysec.com/Spring-Integration-Zip不安全解压(CVE-2018-1261)漏洞分析/

4.漏洞修复

hutool-all-4.1.12.jar!cn/hutool/core/io/FileUtil.class添加了一个checkSlip的安全检测方法,方法中检查父完整路径是否为自路径的前半部分,如果不是则说明不是子路径,可能存在slip注入。

参考链接