今天突然看到了去年写的一篇漏洞分析文章,搬到博客上

----------------

Hutool是Github上的一个开源项目,是一个java的工具包,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时还提供一些其他的组件。目前在Github上已经有了2k+的Star。

Github地址:https://github.com/looly/hutool。

本人通过代码卫士对4.1.12之前的版本做了自动化代码审计,发现在对zip文件进行操作的工具类ZipUtil.java中,由于没有对zip文件的条目做过滤导致zip条目覆盖漏洞(zip_slip)。当使用该工具类对恶意攻击者构造的zip文件进行解压时,可以覆盖项目中的任意文件。由于该问题在新版本中已修复,现公布详情如下:
将该项目放入代码卫士审计结果如下,发现在ZipUtil.java文件中存在路径遍历(zip_slip的原理还是利用到了路径遍历)的问题,且严重等级为高。点击进入可以看到缺陷出现的爆发点以及完整的路径等详细信息:

可以看到该方法分别传入三个参数:outFile表示解压到的目录、charset 表示编码格式、zipFile则表示需要解压的zip文件。在第389行处,程序并没有对zipEntry.getName做任何校验就直接用于创建文件,进而导致了zip_slip漏洞。

以下是我的漏洞复现流程:

如下图所示,假设core文件夹里面的password.txt是我们想要覆盖的文件,fileupload文件夹下是恶意zip文件所在地方(可能是通过上传功能或其他方式),而我们想要达到的效果是通过hutool中ZipUtil提供的api对恶意zip文件进行解压时覆盖core中的password.txt文件。

首先需要构造一个恶意的zip文件,由于无法直接在windows中创建这样的非法文件,需要用代码创建,zip文件创建代码如下:

可以看到22行处,将条目设置为“../core/”进行路径穿透。

使用 hutool中ZipUtil提供的api对恶意zip文件进行解压,只需一行代码即可,指定想要解压的zip文件以及解压目录这两个参数即可,这也是hutool的方便之处。

可以看到成功覆盖了core文件夹下的password.txt文件

设置断点进行调试调试,进行解压的核心代码在unzip(File zipFile, File outFile, Charset charset)中,直接进入到该函数中:

可以看到在创建新的文件时文件名是直接使用的zipEntry.getName(),而此时的zipEntry.getName()为“../core/password.txt”,继续F8

此时的outItemFile已经通过路径穿透到达了core文件夹下。

Hutool已经在4.1.12的版本中修复了该漏洞,具体修复细节如下:

添加了一个checkSlip的安全检测方法,方法中检查父完整路径是否为自路径的前半部分,如果不是则说明不是子路径,可能存在slip注入。使用4.1.12版本的Hutool进行测试回报出异常!

9月12号:发现漏洞

9月13号:提交漏洞

9月13号:确认漏洞

9月21号:CVE-2018-17297

开源项目hutool之zip_slip漏洞的更多相关文章

  1. Github开源项目单

    以下涉及到的数据统计与 2019 年 5 月 1 日 12 点,数据来源:https://github.com/trending/java?since=monthly . 下面的内容从 Java 学习 ...

  2. 开源项目大全 >> ...

    http://www.isenhao.com/xueke/jisuanji/kaiyuan.php   监控系统-Nagios 网络流量监测图形分析工具-Cacti 分布式系统监视-zabbix 系统 ...

  3. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  4. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  5. [转]C,C++开源项目中的100个Bugs

    [转]C,C++开源项目中的100个Bugs http://tonybai.com/2013/04/10/100-bugs-in-c-cpp-opensource-projects/ 俄罗斯OOO P ...

  6. Python:渗透测试开源项目

    Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工 ...

  7. 开源巨献:Google最热门60款开源项目

    文章整理于互联网.本文收集了 60款 Google 开源的项目,排名顺序按照 Github ★Star 数量排列. 0.机器学习系统 TensorFlow  ★Star 62533 TensorFlo ...

  8. 开源项目Bug悬赏任务

    导读 2014 年开源加密库 OpenSSL 项目爆出的高危漏洞 Heartblood 让世人意识到一些鲜为人知的开源项目对整个互联网和其它基础设施的完整性和可靠性至关重要,随后 Linux 基金会发 ...

  9. 2017 码云最火爆开源项目 TOP 50,你都用过哪些

    本文转自:https://share.html5.qq.com/fx/u?r=JdjvzwC 2017 年度码云热门项目排行榜 TOP 50 出炉啦!我们根据所有开源项目在码云的用户关注度.活跃度.访 ...

随机推荐

  1. iframe子页面无法返回上一页的问题

    本文讨论的场景是ipad终端. 如题,因业务需要,需要使用iframe嵌套子页面.让外层始终保持一个socket连接,避免socket每跳转一个页面都要重新关闭建立连接的问题.但是这样问题来了,上线后 ...

  2. error C1002: 在第 2 遍中编译器的堆空间不足

    error C1002: 在第 2 遍中编译器的堆空间不足 fatal error C1083: Not enough space 打开VS2015 x64 x86 兼容工具命令提示符,在此命令行中再 ...

  3. django中同通过getlist() 接收页面form的post数组

    前端中的一些东西: <form action="people?action=edit" method="post"> <input type= ...

  4. 使用mousedown、mousemove、mouseup实现拖拽效果

    如何实现一个元素的拖拽效果,使用原生的js实现,习惯了jquery的同学们,你们自己写了吗?N久使用mvvm框架,不写jquery的东西,感觉自己完全不会了. 话不多说,直接上code.本例子以简单的 ...

  5. Java中的IO流之输入流|乐字节

    亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入 ...

  6. Java注解-注解处理器、servlet3.0|乐字节

    大家好,我是乐字节的小乐,上次给大家带来了Java注解-元数据.注解分类.内置注解和自定义注解|乐字节,这次接着往下讲注解处理器和servlet3.0 一.注解处理器 使用注解的过程中,很重要的一部分 ...

  7. 学习Ajax小结

    Ajax 学习         1.ajax的概念              局部刷新技术,不是一门新技术,是多种技术的组合,是浏览器端技术         2.作用             可以实现 ...

  8. start use webpack

    Demo0操作手册 本Demo演示不使用配置文件的入门级使用 准备环境 初始化环境, cd到demo目录之后, 执行如下命令: npm init -y npm install webpack webp ...

  9. 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)

    设置html,body{height:100%} 在使用html5文档类型的时候, 设置了html body的高度100%之后,两个浏览器就都能获取document.body.clientHeight ...

  10. 【转帖】2011-2018年中国IPv6地址数量及国际出口带宽数走势情况[图]

    2011-2018年中国IPv6地址数量及国际出口带宽数走势情况[图] http://www.chyxx.com/industry/201910/791801.html 三亿多ipv4的地址. 接近9 ...