问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
MCMS v5.4.4漏洞挖掘实战
漏洞分析
在跟踪分析历史漏洞的基础上跟进项目代码,挖掘新型漏洞,成因是由于对zip压缩包的处理不当,导致了路径穿越进行任意文件上传
前言 -- **该漏洞已被上报CNVD,厂商已对其修复** 修复补丁: <https://gitee.com/mingSoft/MCMS/releases/tag/5.5.0> 环境搭建 ---- 直接从官方仓库中拉取v5.4.4的代码后,按照READM.md中的描述进行项目启动 官方仓库:<https://gitee.com/mingSoft/MCMS>  zip slip漏洞 ---------- 使用默认密码`msopen/msopen`登录到后台,之后我们进入到`系统设置->模块管理`功能,其中存在文件上传的位置   这里可以上传ZIP压缩包 ### 漏洞原理分析 随便上传一个ZIP包 前端向后端发送的请求包如下:  在源码中可通过路由定位到`net.mingsoft.basic.action.ManageFileAction#uploadTemplate`方法中  该方法存在一个AOP的实现,在正式进入模板文件上传之前将会通过AOP方法`net.mingsoft.basic.aop.FileVerifyAop#uploadAop`来验证上传zip文件的内容   在`uploadAop`方法中,会调用`BasicUtil.getMimeType`方法来获取上传文件真实的文件类型  其实就是借助了`tika`库的`AutoDetectParser#parse`方法进行文件类型的判断,核心原理是通过提取文件内容中的`magic markers`进行判断 最终,如果检测到的文件类型为zip,将会调用`FileVerifyAop#chekZip`方法进行检查  其中,会调用自己实现的`FileVerifyAop#unzip`方法对上传的文件进行解压缩  简单对该方法进行流程分析 1. 将传入的zip包抽象成了一个`ZipArchiveInputStream`对象,同时这里的`descDir`为我们期待解压文件存放的位置 2. 之后通过`while`循环,获取zip包中的每一个`entry` 1. 对于第一个`if`语句,感觉逻辑本身就有点问题,如果`entry.getName`不为空就不会检查`../`和`..\`字符串是否包含 2. 接下来会通过`/`将`entry.getName`进行分割,进行子目录的创建,这里对是否会导致目录穿越进行了避免 3. 紧接着,如果提取的entry是一个目录,则会创建对应的目录,同时如果提取的entry不是一个目录,这里将会将我们期待的解压路径`descDir`和`entry.getName`的值直接未经过滤的情况下直接进行拼接,并将文件内容写入,这里将会导致路径穿越 虽然在`checkZip`检查结束之后,将会调用`FileUtil.del(tempFilePath)`对我们在检查过程中解压的文件进行删除,但是这里仅仅删除掉了我们期待解压的路径`descDir`下的文件,对于我们穿越后的文件不会进行删除 上述流程导致的zip slip漏洞是在`checkZip`的过程中导致的,而在检查zip AOP方法完成之后,将会回到`ManageFileAction#uploadTemplates`方法进行上传逻辑  虽然这里在上传zip文件后,仍会对其进行解压,但是这里并没有采用自己实现的解压逻辑,而是使用hutool组件的unzip逻辑,该组件对zip slip这类漏洞进行处理,则不存在该漏洞 ### 漏洞复现 首先制作一个有害的ZIP压缩包 准备一个待上传的文件hacked  之后运行下面脚本生成恶意的ZIP文件 ```python import zipfile if __name__ == "__main__": try: zipFile = zipfile.ZipFile("pocpoc.zip", "a", zipfile.ZIP_DEFLATED) info = zipfile.ZipInfo("pocpoc.zip") zipFile.write("xxx/zip_slip/hacked", "../../../hacked", zipfile.ZIP_DEFLATED) zipFile.close() except IOError as e: raise e ```  上传前,希望穿越到的目录下不存在该文件  接下来,上传我们制作的ZIP包  其未经过滤,直接进行了拼接  上传后,成功穿越目录将hacked文件上传到了我们希望传到的目录下  **说明:**上述操作为无害化演示,上述漏洞能够将文件上传到系统的任意位置,例如定义任务目录、Web服务目录等等位置均可导致远程命令执行漏洞 ### 修复建议 检查entry.getName()是否存在`../`并拦截 修复方式 ---- 根据新版的修复方式,其直接移除了自己实现的`unzip`函数,采用hutools框架的`ZipUtil.unzip`实现进行解压缩
发表于 2025-06-10 17:04:09
阅读 ( 486 )
分类:
CMS
1 推荐
收藏
1 条评论
c铃儿响叮当
1秒前
求源码
请先
登录
后评论
请先
登录
后评论
leeh
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!