ZIP目录遍 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件。可以利用此漏洞写入计划任务,或者写入Webshell造成任意代码执行漏洞。
0X01 ZIP目录遍历
因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件。可以利用此漏洞写入计划任务,或者写入Webshell造成任意代码执行漏洞。
0X02 漏洞原理
在Linux/Unix系统中“../”代表的是向上级目录跳转,有些程序在当前工作目录中处理到诸如用“../../../../../../../../../../../etc/hosts”表示的文件,会跳转出当前工作目录,跳转到到其他目录中。
Java代码在解压ZIP文件时,会使用到ZipEntry类的getName()方法,如果ZIP文件中包含“../”的字符串,该方法返回值里面原样返回,如果没有过滤掉getName()返回值中的“../”字符串,继续解压缩操作,就会在其他目录中创建解压的文件。
0x03风险示例
近期做项目遇到一个从来没见过的小CMS,闲来无事就看着玩玩,所以用Dreamer CMS为例,在Dreamer CMS的风格设置中允许用户通过网络下载新的主题进行更换,主题文件其实是一个ZIP压缩文件。通过直接上传构造的恶意zip文件进行漏洞验证。
源码下载地址https://gitee.com/isoftforce/dreamer\_cms
使用evilzip https://github.com/TheKingOfDuck/evilzip 来构造恶意ZIP文件
上传恶意ZIP文件
系统进行解压
解压到我们设置的目录中,证明存在漏洞
0x04漏洞原因
主题文件其实是一个ZIP压缩包,从服务器下载后进行解压,但是解压时没有过滤entry.getName()返回的字符串中是否有“../”:
0x05漏洞利用
- 本文作者: 来给你一口甜
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/444
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!