【代码审计】Spring Integration Zip不安全解压(CVE-2018-1261)漏洞分析

1.漏洞相关信息

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

漏洞编号:CVE-2018-1261

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

漏洞原理:攻击者可以通过构造一个包含名称带../前缀的文件的压缩包,在spring-integration-zip进行解压时文件跳出解压文件的目录限制,创建文件

漏洞利用前置条件

1.使用了spring-integration-zip库

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

2.环境搭建

Libraries:

3.漏洞复现

恶意压缩包文件内容

测试代码如下

unZipTransformer.setWorkDirectory(path);设置了解压文件的路径,在CVE-2018-1261目录下会生成good.txt文件,而eval文件就会逃出限制,在根目录生成文件

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.integration.zip.transformer.UnZipTransformer;
import org.springframework.messaging.Message;

import java.io.File;
import java.io.InputStream;

public class Main {
    private static ResourceLoader resourceLoader = new DefaultResourceLoader();
    private static File path =  new File("./CVE-2018-1261/");
    public static void main(final String... args) {
        final Resource evilResource = resourceLoader.getResource("classpath:zip-malicious-traversal.zip");
        try{
            InputStream evilIS = evilResource.getInputStream();
            Message<InputStream> evilMessage = MessageBuilder.withPayload(evilIS).build();
            UnZipTransformer unZipTransformer = new UnZipTransformer();
            //设置解压文件的目录为CVE-2018-1261
            unZipTransformer.setWorkDirectory(path);
            unZipTransformer.afterPropertiesSet();
            //漏洞入口点
            unZipTransformer.transform(evilMessage);
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

示例中的UnZipTransformer.transform()会调用doZipTransform()来处理压缩包

在遍历压缩包内目录及文件时,回调ZipEntryCallback中的process()对其进行处理

ZipUtil.iterate(inputStream, new ZipEntryCallback() {
    @Override
    public void process(InputStream zipEntryInputStream, ZipEntry zipEntry) throws IOException {

        final String zipEntryName = zipEntry.getName();
        ...
        if (ZipResultType.FILE.equals(zipResultType)) {
            final File tempDir = new File(workDirectory, message.getHeaders().getId().toString());
            tempDir.mkdirs(); //NOSONAR false positive
            final File destinationFile = new File(tempDir, zipEntryName);

            if (zipEntry.isDirectory()) { ...   }
            else {
                SpringZipUtils.copy(zipEntryInputStream, destinationFile);
                uncompressedData.put(zipEntryName, destinationFile);
            }
        }
    ...
}

../../../那一串是通过zipEntry.getName()得到的

final File destinationFile = new File(tempDir, zipEntryName);确定解压目录

接着就是调用copy put

获取传过来的输入数据以及从文件系统中的某个文件中获得输入字节,把数据写到destinationFile处

要提前在根目录下创建tmp文件夹

原文地址:https://www.cnblogs.com/sqyysec/p/9038892.html

时间: 2024-10-10 09:43:56

【代码审计】Spring Integration Zip不安全解压(CVE-2018-1261)漏洞分析的相关文章

java基础之zip(压缩、解压)

本程序依赖第三方包Ant.jar.因为java自带的java.utils.zip.ZipOutputStream对一些敏感中文路径会抛出异常. package javax.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Ou

正确的 zip 压缩与解压代码

网上流传的zip压缩与解压 的代码有很大的问题 虽然使用了ant进行压缩与解压,但是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的目录结构有误,甚至出现不同解压软件显示的目录结构不同的窘境. 下面给出使用org.apache.tools.ant.taskdefs.Zip;和org.apache.tools.ant.taskdefs.Expand 的压缩和解压过程. import java.io.File; import org.apache.tools.a

liunx之zip格式的解压命令

zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d /home/sunny myfile.zip 把myfile.zip文件解压到 /home/sunny/ -o:不提示的情况下覆盖文件: -d:-d /home/sunny 指明将文件解压缩到/home/sunny目录下: 3.其他 zip -d myfile.zip smart.txt 删除压缩文件中smart

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

zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件里没有实现解压进度的功能,这里进行一简单的实现. Zip4jSp.java /** * unzip file to dest dir with password in thread. * * @param zipFile * @param dest * @param passwd * @param chars

linux ubuntu12.04 解压中文zip文件,解压之后乱码

在windows下压缩后的zip包,在ubuntu下解压后显示为乱码问题 1.zip文件解压之后文件名乱码: 第一步 首先安装7zip和convmv(如果之前没有安装的话) 在命令行执行安装命令如下: sudo apt-get install p7zip-full convmv 第二步 假设zip文件名为y05文档.zip,那么先进入zip文件所在的目录,然后命令行执行 LANG=C 7z x y05文档.zip convmv -f cp936 -t utf8 -r --notest * 2.文

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

FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Fi

golang zip 压缩,解压(含目录文件)

每天学习一点go src. 今天学习了zip包的简单使用,实现了含目录的压缩与解压. 写了两个方法,实现了压缩.解压. package ziptest import ( "archive/zip" "io" "os" "strings" ) //压缩文件 //files 文件数组,可以是不同dir下的文件或者文件夹 //dest 压缩文件存放地址 func Compress(files []*os.File, dest str

Zip 压缩、解压技术在 HTML5 浏览器中的应用

JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这时候只需要做一次请求,这样既减少了服务器的压力,同时也可以加快 web 应用的呈现速度. 今天就来探讨下 JSZip 如何与 HT 拓扑应用结合.先来看看这期 Demo 的效果图: 第一步.需要将应用对相关资源打包成 .zip 文件, 这是我要压缩的文件列表,把响应的资源文件存放到对应的文件夹下,然

mysql-5.7.20-winx64.zip Zip版、解压版MySQL安装

1.  zip下载地址: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-winx64.zip 2.官方文档位置: http://dev.mysql.com/doc/refman/5.7/en/installing.html 3.将文件解压到你喜欢的位置,我解压到了C:盘根目录 4.在压缩包根目录下创建my.ini 文件,如图: 文件里面如图添加 [mysqld] 端口port=3306 需要添加字符编码的设置(放到port下