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. (转)IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别

    本文来自:https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral,非常感谢 ...

  2. chmod及chown命令详解

    1,chmod 指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/ ...

  3. 【BZOJ】1485: [HNOI2009]有趣的数列

    [算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为 ...

  4. 【Atcoder】ARC088 D - Wide Flip

    [题目]D - Wide Flip [题意]给定n个数字的01序列,要求每次翻转>=k个数字使得全0,求最大的k.n<=10^5 [算法]数学 [题解]有两个角度可以得到等价的结论: 1. ...

  5. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(上)

    第三章 High CPU Utilization. CPU使用率过高问题很容易被发现,但是诊断却不是很容易.CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧. 调查CPU ...

  6. centos下搭建YII环境

      第一步:安装lnmp wget -c http://soft.vpser.net/lnmp/lnmp1.4-full.tar.gz 下载完lnmp后,进行解压文档 tar zxf lnmp1.4- ...

  7. 45、如何使用python删除一个文件?

    若想利用python删除windows里的文件,这里需要使用os模块!那接下来就看看利用os模块是如何删除文件的! 具体实现方法如下! os.remove(path) 删除文件 path. 如果pat ...

  8. 可能是是最全的Springboot基础视频分享,告别无视频可学

    一头扎进SpringBoot视频教程 SpringBoot入门 2017年-张志君老师-SpringBoot(新增) 欢迎关注我的微信公众号:"Java面试通关手册" 回复关键字& ...

  9. Cookie、Session 和 自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  10. vsftpd限速设置

    利用vsftp进行速率限制,需要了解几个配置参数 anon_max_rate 设置匿名用户每条连接最大上传或下载速率 local_max_rate 设置本地用户每条连接最大上传或下载速率 max_pe ...