浅谈zip格式处理逻辑漏洞

PHP伪协议在CTF文件包含漏洞中的实战利用与绕过技巧 文件包含漏洞是Web安全中常见的安全隐患,其本质在于程序未对用户输入的文件名进行严格校验,导致攻击者可以包含并执行任意文件。其核心原理在于动态包含函数(如include、require)将用户可控的变量作为文件名参数,若过滤不严,攻击者便能操纵该变量读取系统敏感文件或执行恶意代码。PHP伪协议作为内置的封装协议,极大地扩展了文件包含的利用面,它通过转换数据源和形式,能够有效绕过常见的路径过滤与后缀限制,将简单的本地文件读取漏洞升级为代码执行漏洞,具有极高的技术价值。在CTF竞赛和渗透测试中,php://fi 阅读详情

前言:zip压缩格式应用广泛,各个平台都有使用,Windows平台使用来压缩文件,Android平台使用来作为apk文件的格式。由于zip文件格式比较复杂,在解析zip文件格式时,如果处理不当,可能导致一些有意思的逻辑漏洞,本篇文章将挑选有意思的漏洞进行解析。

一、文件扩展名欺骗漏洞


很早之前,国外安全研究人员爆料Winrar 4.x版本存在文件扩展名欺骗漏洞,黑客可以通过该漏洞诱骗受害者执行恶意程序。该漏洞的主要原理是:Winrar在文件预览和解压缩显示文件名使用的是不同结构体的字段导致的。

1.1 zip格式文件的结构

在了解漏洞的原理前,先熟悉下zip格式的文件结构。

如果一个压缩包文件里有多个文件,可以认为每个文件都是被单独压缩,然后再拼成一起。

一个 ZIP 文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志,如下图:


1)文件头(压缩源文件目录区)在文件末尾,即图1中的File Header,记录了索引段的偏移、大小等等。

2)数据段(压缩源文件数据区)在文件开头,即图1中的Local Header,记录了数据的一些基本信息,可以用来跟File Header中记录的数据进行比较,保证数据的完整性。

3)Local Header还包含了文件被压缩之后的存储区,即图1中的Data区域。

4)图2和图3为Local Header(图2中的ZIPFILERECORD)和File Header(图3中的ZIPDIRENTRY)的数据对比,两者数据是一致的。



1.2 漏洞产生原因

Winrar在文件预览的时候使用的是ZIPDIRENTRY下面的deFileName字段来显示文件名,解压缩的时候使用的是ZIPFILERECORD下面的frFileName字段来显示文件名。如果将deFileName字段文件扩展名改成jpg、gif等图片的文件扩展名,可以欺骗用户运行恶意程序。

Winrar文件预览示意图:


用户看到的是jpg图片,打开的确实exe文件,真坑啊!

Winrar解压缩文件示意图:


解压缩之后显示的exe,两处显示的不一样。

二、Android Master Key漏洞


之前,国外安全研究人员爆出第三个Android Master Key漏洞,该漏洞的主要原理是:android在解析Zip包时,没有校验ZipEntry和Header中的FileNameLength是否一致。

2.1 zip文件格式的结构

在了解漏洞的原理前,还是先熟悉下zip格式的文件结构。

如果一个压缩包文件里有多个文件,可以认为每个文件都是被单独压缩,然后再拼成一起。

一个 ZIP 文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志,如图1所示:

1)文件头(压缩源文件目录区)在文件末尾,即图1中的File Header,记录了索引段的偏移、大小等等。

2)数据段(压缩源文件数据区)在文件开头,即图1中的Local Header,记录了数据的一些基本信息,可以用来跟File Header中记录的数据进行比较,保证数据的完整性。

3)Local Header还包含了文件被压缩之后的存储区,即图1中的Data区域。

4)图2和图3为Local Header(图2中的ZIPFILERECORD)和File Header(图3中的ZIPDIRENTRY)的数据对比,两者数据是一致的。



2.2 漏洞产生原因

先来看一下是如何定位到Local Header中的Data数据:

off64_t dataOffset = localHdrOffset + 
                     kLFHLen + 
                     get2LE(lfhBuf + kLFHNameLen) +


Data的偏移是通过Header的起始偏移+Header的大小(固定值)+Extra data的大小+文件名的大小,如下图


回头看一下,java在获取Data偏移的处理,在读取Extra data的长度的时候,它已经预存了文件名在FileHeader中的长度。

// We don't know the entry data's start position. 
// All we have is the position of the entry's local 
// header. At position 28 we find the length of the 
// extra data. In some cases this length differs 
// from the one coming in the central header. 

RAFStream rafstrm = new RAFStream(raf, 
         entry.mLocalHeaderRelOffset + 28); 
DataInputStream is = new DataInputStream(rafstrm); 
int localExtraLenOrWhatever = 


漏洞就在这里产生了,如果Local Header中的FileNameLength被设成一个大数,并且FileName的数据包含原来的数据,File Header中的FileNameLength长度不变,那么底层C++运行和上层Java运行就是不一样的流程。

C++ Header 64k Name Data 
+--------> +----------------------> +----------> 
length=64k classes.dex dex\035\A... dex\035\B... 
+--------> +---------> +----------> 

如上面所示,底层C++的执行会读取64k的FileName长度,而Java层由于是读取File Header中的数据,FileName的长度依旧是11,于是Java层校验签名通过,底层执行会执行恶意代码。

原文地址:http://drops.wooyun.org/papers/9893

SQL注入靶场搭建与手工注入实战:从原理到防御 SQL注入作为Web安全领域的经典漏洞,其核心原理在于用户输入被误执行为代码,从而绕过应用逻辑直接操作数据库。理解这一漏洞需要从数据库查询机制入手,即SQL语句的拼接与执行过程。当用户输入未经充分验证或转义便直接拼接到SQL命令中时,攻击者可通过构造特殊字符(如单引号、注释符)改变原语句结构,实现数据窃取、篡改甚至服务器控制。这种漏洞的广泛存在使其成为渗透测试与安全防御的重点关注对象。在实战中,安全研究人员常使用DVWA、SQLi-Labs等靶场进行合法练习,通过手工注入步骤(如探测注入点、联合查询、盲注) 阅读详情

相关推荐

CTF-压缩包总结——更新中

明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)时,且这两个文件的CRC值相同,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件。掩码攻击:如果已知密码的某几位,如已知6位密码的第3位是a,那么可以构造?CRC32值的变动,对应着数据的变动,利用这个原理我们可以直接爆破出加密文件的内容。XX XX XX XX:目录区对第一张磁盘的偏移量。

ljf5946的博客 1817

(加密解密技术内幕)File Header (文件头)

我们将要研究PE header的file header(文件头)部分。至此,我们已经学到了哪些东东,先简要回顾一下:DOS MZ header又命名为IMAGE_DOS_HEADER.。其中只有两个域比较重要:e_magic包含字符串"MZ",e_lfanew包含PE header在文件中的偏移量。比较e_magic是否为IMAGE_DOS_SIGNATURE以验证是否是有效的DOS header...

bruce135lee的专栏 3141

水果库存管理系统开发实战:从原型设计到Python/PHP源码实现

库存管理是零售与供应链领域的核心基础技术,其核心原理在于通过信息化手段,对商品的进、销、存数据进行精准追踪与实时同步,以解决人工管理效率低下、易出错的问题。在技术实现上,关键在于设计健壮的数据模型与业务流程,确保数据一致性,例如通过数据库事务与锁机制来防止库存超卖。其技术价值在于将零散的业务操作转化为结构化数据流,为经营分析、智能预警和决策优化提供数据基石。这一技术广泛应用于生鲜零售、仓储物流及各类实体门店的管理场景。本文以水果店库存管理为具体案例,深入剖析了如何结合Axure原型工具与MySQL数据库设计

weixin_42629522的博客 319

zipimport.ZipImportError: bad local file header错误的解决办法

在debian/ubuntu系中比较常见。(更新不勤快的发行版不是好发行版) 这个是setuptools老版本(0.6)中已被查明的BUG,在新版本中已经得到解决,使用老版本的可以用以下命令升级setuptools(1.0)进行修复: wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | pyt

Scape1989的专栏 8013

阿里云大模型ACP认证模拟考试(三)

【摘要】:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 3578

矢量量化的基本原理:高效数据压缩与信息检索的关键矢量量化(Vector Quantization,简称VQ)是一种数据压缩和信

此外,在矢量量化过程中,可能会引入一定的信息损失,对一些精细特征的表示可能存在一定的误差。它通过将高维数据映射到低维码本空间中,并将相似的数据映射到相同的码本向量中,实现对数据的高效表示和存储。最重要的是,矢量量化可以用于数据的检索和分析,提供了高效的数据查询和处理手段。通过使用码本索引,我们可以高效地存储和检索大量的数据。在图像处理中,矢量量化可以用于图像压缩,将复杂的图像数据转化为较少的码字,实现图像的存储和传输。矢量量化通过将连续的高维数据分割并映射到有限的码本集合中,实现数据的离散表示和压缩。

m0_70886513的博客 1372

zip 文件格式分析: 附实例介绍

zip 文件格式分析: 附实例介绍ZIP format Byte order: Little-endianOverall zipfile format:[Local file header + Compressed data [+ Extended local header]?]* [Central directory]* [End of central directory record]1.

hjjdebug的专栏 1万+

4、设备树的处理(1)

其实到第4节才写设备树的问题完全是因为忘记了,之前有一个版本是先关闭了设备树的,习惯性的认为设备树已经处理完了,失误了!!!前文说过,这个系统是依着荣品的开发板和核心板来的,使用的是5.1内核的SDK。它的SDK里是开发板全功能的,所以设备树也是的。

wsen2012的博客 416

Zip文件格式

标识头 50 4B 01 02 kCentralFileHeader 50 4B 03 04 kLocalFileHeader 50 4B 05 06 kEndOfCentralDir kEndOfCentralDir

zzz3265的专栏 875

软件测试工程师笔试题

这里写目录标题全套软件测试面试笔试题(附答案)二、选折三、添空四、简答(资料是搜集整理的,感谢前辈的解题)无1.区别阶段评审的与同行评审2.什么是软件测试3. 简述集成测试的过程4 怎么做好文档测试5 白盒测试有几种方法6 系统测试计划是否需要同行审批,为什么7Alpha 测试与 beta 的区别8 比较负载测试,容量测试和强度测试的区别。性能测试从使用方便的角度来说,9 测试结束的标准是什么?10 描述软件测试活动的生命周期?11 软件的缺陷等级应如何划分? 软件测试工程师笔试题(附答案) 全套软件测试面

m0_46446002的博客 2549

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS

FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。

qq_52137732的博客 1万+

解决zip文件中文乱码问题

问题根本就不出现在这里,而是出现在前端。在一个项目中,把后台的文件打包成zip,下载到前台。结果发现zip文件名本身乱码,zip文件内压缩的文件也是乱码。不能说网上的东西都是错了,但确实很大一部分都是没有自己实践,直接转的。关键是分析到底那步出现的问题:是服务器端生成时出现的,还是传递过程中发生的。1、Zip文件中的文件名使用的是一种称为"CP437"的字符集编码,所以要按CP437编码文件名字。结果:文件名字这各种转换,无效,怎么折腾都是乱码,而且更乱。文件名字这里也是各种转码,折腾,全部无效。

wangbing1125的博客 4018

最佳量化交易的计算机操作系统

本文在Creative Commons许可证下发布   我经常被问到的一个问题是:用哪种计算机操作系统和计算软件进行量化交易的理论研究和代码实现?   我想把这个问题简化,从挑选的计算软件和计算库来反推最佳使用的计算机操作系统。简而言之,就是在本文撰写的时候而言,如果你想进行基于任何严肃的数学理论和金融量化交易研究理论,这里特指机器学习或者深度学习。并且需要在本地研究机器上使用桌面版本,...

evilqliang的博客 2306

【Linux系统编程】Cyberpunk在霓虹丛林中构建堡垒 ——【Linux环境配置 与 基础指令】

本文介绍了Linux操作系统的基本概念、安装方法和常用指令。主要内容包括: 操作系统概述:Linux作为资源管理器,负责硬件管理和软件服务,是计算机系统的核心软件。 Linux生态体系:从操作系统内核、软件体系、文档支持、社区论坛、更新维护到目标用户群体,全面解析Linux生态构成。 环境准备:推荐使用云服务器而非虚拟机进行Linux学习,并提供了相关安装资源链接。 基础指令操作:详细说明如何通过Xshell连接云服务器并切换超级管理员(root)模式,为后续Linux指令

枫亭湖区的博客 6258

Synthesia技术浅析(四):自然语言处理

Synthesia 的自然语言处理(NLP)模块是其核心技术之一,涵盖了文本转语音(TTS)、情感分析以及多语言支持等多个方面。

m0_75253143的博客 1166

基于STM32L4XX的环境光传感器(LTR-303ALS-01)应用程序设计

/ 状态寄存器的位[2:0]表示数据状态,例如位2为1表示新数据就绪[citation:6]#define LTR303_REG_DATA_CH0_LOW 0x8D // CH0数据低字节。#define LTR303_REG_DATA_CH0_HIGH 0x8E // CH0数据高字节。#define LTR303_REG_DATA_CH1_LOW 0x8F // CH1数据低字节。#define LTR303_REG_DATA_CH1_HIGH 0x90 // CH1数据高字节。

myron6688的博客 405

关于zip压缩文件格式、解决伪加密

修改文件头的加密标志位 一个zip文件由三个部分组成: 压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志 (详解链接) 这是三个头标记,主要看第二个 压缩源文件数据区:50 4B 03 04:这是头文件标记 14 00:解压文件所需 pkware 版本 00 00:全局方式位标记(有无加密) 08 00:压缩方式 5A 7E:最后修改文件时间 F7 46:最后修改文件日期 16 B5 8...

qq_38997509的博客 1677

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

header不一致导致不能解压缩,not in gzip format(适用于Gzip, Deflater等以字节数组存储的加密技术)

not in gzip format原因是在解压缩时,Gzip对输入流进行CRC校验时GZIP_MAGIC于要求不符,Deflater类似,解决办法就是转单字节编码,大家可以参考例子。同时,使用base64加密解密也是一种方案。

hxy5125225的博客 868

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RAR/ZIP文件解压(兼容RAR5)

RAR/ZIP文件解压,兼容RAR5格式文件;

Zephyr_Syn 1411

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk自带的visual gc ”不受此jvm支持“

gc监控 visual VM不受此jvm支持

csdn_binger的博客 2138

编译时报错:zip END header not found 解决方法

Java: 读取E:\apache-maven-3.8.2\repository\com\lowagie\itext\2.1.7\itext-2.1.7.jar时出错; zip END header not found

qq_42026590的博客 2万+

Linux中unzip解压乱码,mismatching “local“ filename ..., continuing with “central“ filename version

unzip -qO UTF-8 front.zip # 指定为utf-8格式,也可以指定为其他格式,就不会出现乱码了。原因是中文乱码问题,压缩文件中有中文命名的文件,解压出来就出现了乱码,

走在搬砖的路上! 2077

java.lang.zip异常,解压zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException无法读取本地标题版本45”...

我只想提取一个普通的zip文件,但它总是失败。这是我现在使用的代码:private File downloadPath = new File(Environment.getExternalStorageDirectory() + "/Test/file.zip");private File unzipLoc = new File(Environment.getExternalStorageDire...

weixin_33019705的博客 772

android java.util.zip.zipexception,android – 解压缩zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.ut...

我想提取一个普通的zip文件,但它仍然失败.这是我现在使用的代码:private File downloadPath = new File(Environment.getExternalStorageDirectory() + "/Test/file.zip");private File unzipLoc = new File(Environment.getExternalStorageDirec...

weixin_33958222的博客 503
上一篇: 获取unity当前版本号
下一篇: zlib库剖析(1):实现概览
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值