ref:https://mp.weixin.qq.com/s/SJPXdZWNKypvWmL-roIE0Q

0x00 漏洞概览

漏洞名称:Spring Integration Zip不安全解压

漏洞编号:CVE-2018-1261

漏洞级别:严重(官方定级,比高危还高)

漏洞危害:在spring-integration-zip.v1.0.1.RELEASE之前的版本中,恶意用户通过在压缩文件中构造包含有特定文件名称的文件(受影响文件格式有bzip2, tar, xz, war, cpio, 7z),应用程序使用spring-integration-zip进行解压时,会导致跨目录任意写入文件漏洞的攻击。进而有可能被Getshell,远程控制。

漏洞加固:更新升级,zip.v1.0.2.RELEASE版本

漏洞利用前置条件:

使用了spring-integration-zip库

接收并解压了来自不可信来源的压缩文件

0x01 漏洞分析

补丁比对

zip.v1.0.1.RELEASE在UnZipTransformer调用ZipUtil.iterate()时定义的回调中增加了一段对文件名称校验的代码片段(在5月11日凌晨更新的zip.v1.0.2.RELEASE版本中,对Byte[]类型的分支逻辑也增加了文件名称校验,并且删除了对名称中..的判断,直接校验名称是否以工作区目录开头)。

通过上述内容我们大致可以猜测这个漏洞的原理:攻击者可以通过构造一个包含名称带../前缀的文件的压缩包,使spring-integration-zip进行解压时该文件跳出解压目录被创建。

而且在zip.v1.0.1.RELEASE也增加了对这类压缩包的测试用例,并且十分贴心的附上了一个“恶意”的压缩包测试文件zip-malicious-traversal.zip。

我们先看看这个压缩包长什么样子:

稍微说明一下:

右上,压缩包正常打开的目录结构

右下,压缩包的文本形式数据

左,压缩包解压后的目录结构

从文本数据中不难看出,这个压缩包中存在一个以很多../开头为名称的文件evil.txt。以压缩工具打开查看时,它以目录树形式显示,而解压后最深层的有效目录及文件被提取至根目录(说明使用的这个工具不存在这类解压漏洞)。

这样就可以很清楚的知道,这个压缩包如果被zip.v1.0.0.RELEASE解压,evil.txt文件将会被写入工作区目录对应盘符下的tmp目录中。

搭个调试环境跑起来看看。

0x02 环境搭建

IDE:IDEA

JDK:1.7

Libraries

spring-integration-zip.1.0.0.RELEASE

spring-integration-core.4.3.10.RELEASE

spring-integration-file.4.3.10.RELEASE

zt-zip.1.11

关键代码如下(参考官方测试用例即可):

流程跟踪

流程很简单,示例中的UnZipTransformer.transform()会调用doZipTransform()解压,在遍历压缩包内目录及文件时,回调ZipEntryCallback.process()对其进行处理。

当遍历到evil.txt时,它被识别为一个文件,而并不是多层的目录结构,那一堆乱七八糟的只是它的文件名:

而对正常压缩包遍历到目录时应该是这样的:

然后根据文件名在工作区目录中创建对应文件(子目录会在遍历时被提前创建),并调用org.apache.commons.io包中的IOUtils.copy()复制文件数据。

此时,解压的文件名被转换为绝对路径:

程序运行结束,查看E:\tmp\目录下发现evil.txt文件(由于Win操作系统默认没有/tmp目录,因此我在测试前提前创建了一个,也可以直接使用已存在目录,如Web Root:P):

0x03 POC生成

知道了漏洞原理后,我们比较好奇的是如何生成这种特殊的压缩文件,已知方法有(如果有更方便的方法,请告诉我):

用二进制数据构造符合压缩包数据结构的文件

使用spring-integration-zip压缩

我们用方法2做个测试,关键代码如下:

再解压试试

可以看到hw.txt跳出解压目录外层来了,OK,打完收工。

参考

ref:Spring Integration Zip 不安全解压(CVE-2018-1261)漏洞分析的更多相关文章

  1. Spring Integration Zip不安全解压(CVE-2018-1261)漏洞复现

    不敢说分析,还是太菜了,多学习. 文章来源: 猎户安全实验室 存在漏洞的源码下载地址:https://github.com/spring-projects/spring-integration-ext ...

  2. liunx之zip格式的解压命令

    zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d /home/s ...

  3. 正确的 zip 压缩与解压代码

    网上流传的zip压缩与解压 的代码有非常大的问题 尽管使用了ant进行压缩与解压,可是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的文件夹结构有误,甚至出现不同 ...

  4. Android之zip文件加密解压及进度条的实现

    zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件 ...

  5. java zip 压缩与解压

    java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java. ...

  6. 文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.

    FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.Bu ...

  7. Linux tar.gz 、zip、rar 解压 压缩命令

    tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...

  8. 「Python实用秘技01」复杂zip文件的解压

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...

  9. zip压缩,解压

    //引用 System.IO.Compression.FileSystem.dll var basePath = AppDomain.CurrentDomain.BaseDirectory; Syst ...

随机推荐

  1. SpringBoot(五) :spring data jpa 的使用

    原文出处: 纯洁的微笑 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法 ...

  2. IE6+IE7+IE8+IE9+FF兼容性调试

    HACK原理:不同浏览器对各中字符的识别不同 (读完文章你会发现,FF和IE8对以下字符的识别能力完全相同) 在 CSS中常用特殊字符识别表: (1)*:  IE6+IE7都能识别*,而标准浏览器FF ...

  3. 打表找规律C - Insertion Sort Gym - 101955C

    题目链接:https://cn.vjudge.net/contest/273377#problem/C 给你 n,m,k. 这个题的意思是给你n个数,在对前m项的基础上排序的情况下,问你满足递增子序列 ...

  4. 阿里云一键web环境包

    下载地址:https://files.cnblogs.com/files/wordblog/af3a48ef-3a13-479e-85c9-ead61173126c.zip 先把安装包传到服务器上用w ...

  5. VueJS 轻松支持 JSX 配置

    使用: babel-preset-vue-app TODO

  6. spring-boot-JdbcTemplate

    添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  7. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  8. python OS 模块 文件目录操作

    Python OS 模块 文件目录操作 os模块中包含了一系列文件操作的函数,这里介绍的是一些在Linux平台上应用的文件操作函数.由于Linux是C写的,低层的libc库和系统调用的接口都是C AP ...

  9. 使AJAX可缓存——基于flask

    主流浏览器都有缓存机制,主要基于HTTP协议定义的缓存策略.对于一定时间内不发生变动的文档缓存起来,对于下次请求,就可以直接返回缓存的结果.使用缓存有以下好处: 1.减少冗余的数据传输,节省网络流量成 ...

  10. 2018-2019-2 网络对抗技术 20165301 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165301 Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS ...