ref:Spring Integration Zip 不安全解压(CVE-2018-1261)漏洞分析
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)漏洞分析的更多相关文章
- Spring Integration Zip不安全解压(CVE-2018-1261)漏洞复现
不敢说分析,还是太菜了,多学习. 文章来源: 猎户安全实验室 存在漏洞的源码下载地址:https://github.com/spring-projects/spring-integration-ext ...
- liunx之zip格式的解压命令
zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d /home/s ...
- 正确的 zip 压缩与解压代码
网上流传的zip压缩与解压 的代码有非常大的问题 尽管使用了ant进行压缩与解压,可是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的文件夹结构有误,甚至出现不同 ...
- Android之zip文件加密解压及进度条的实现
zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件 ...
- java zip 压缩与解压
java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java. ...
- 文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.
FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.Bu ...
- Linux tar.gz 、zip、rar 解压 压缩命令
tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...
- 「Python实用秘技01」复杂zip文件的解压
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...
- zip压缩,解压
//引用 System.IO.Compression.FileSystem.dll var basePath = AppDomain.CurrentDomain.BaseDirectory; Syst ...
随机推荐
- Java中String的替换函数:replace与replaceAll的区别
例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]"; 要将里面的"kk"替换为++,可以使用两种方法得到相同的结果 r ...
- Ubuntu+NDK编译openssl
为了Android上使用libcurl且支持HTTPS协议,需要依赖openssl,因此先来了解一下如何编译OpenSSL1.编译ARM下的共享库(默认的)我使用的是guardianproject的o ...
- zTree使用技巧与详解
zTree--Jquery 树插件,是在后台管理页面中常使用到的插件. 使用效果图: 核心代码: zTree配置: var setting = { data:{simpleData:{enable:t ...
- Google Map API 应用实例说明
目录 Google Map API 1基础知识 1.1 Google 地图 API 概念 1.2 Google 地图的"Hello, World" 1.2.1 加载 Google ...
- HTML入门(一)
---恢复内容开始--- HTML 一 .HTML介绍 1. 什么是HTML? 超文本标记语言: 超文本: 比普通文本更强大 标记语言: 使用一组标签对内容进行描述的一门语言,它不是编程语言! 2. ...
- Eclipse自动代码补全
Windows——>Preferences——>Java-->Editor-->Content Asist, 在Auto activation triggers for Jav ...
- JavaScript事件和方法
单击一个超链接触发事件 1.用a标签的onclick <a href="#" onclick="js代码"> 这种写法呢,存在一种弊端,就是点击后会 ...
- iframe子夜页面调父页面的方法 取父页面的值
1.调父页面的方法的写法 window.parent.yincang();//yincang()是父页面的一个方法 2.取父页面的值的写法 window.parent.document.gettEle ...
- 【洛谷 P4360】 [CEOI2004]锯木厂选址(斜率优化)
题目链接 一开始我的\(dp\)方程列错了,其实也不能说列错了,毕竟我交上去还是把暴力的分都拿到了,只是和题解的不一样,然后搞半天没搞出来去看题解,又看不懂,对不上,原来状态设置不一样自闭了. \(f ...
- 关于Re模块的一些基础知识(另附一段批量抓代理ip的代码)
1.常用匹配规则 . 表示任意字符[0-9] 用来匹配一个指定的字符类别[^5]表示除了5之外的其他字符,^不在字符串的开头,则表示它本身.* 对于前一个字符重复0到无穷次+ 对于前一个字符重复1到无 ...