kkFileView 4.2.0-4.4.0 任意文件上传导致远程执行漏洞分析
字数 1266 2025-08-23 18:31:34
kkFileView 4.2.0-4.4.0 任意文件上传导致远程执行漏洞分析
漏洞概述
kkFileView 是一个基于 Spring Boot 构建的文件文档在线预览解决方案,支持主流办公文档的在线预览。在 4.2.0 到 4.4.0-beta 版本中,文件上传功能存在 ZIP 路径穿越问题,导致攻击者可以通过上传恶意构造的 ZIP 包覆盖任意文件,进而可能导致远程代码执行。
影响版本
- kkFileView 4.2.0 至 4.4.0-beta
漏洞原理
漏洞源于对压缩文件解压时未正确处理文件路径,导致攻击者可以通过构造包含路径穿越符号(如../)的 ZIP 文件,将恶意文件写入系统任意位置。
环境搭建
-
下载受影响版本(如 v4.3.0):
https://github.com/kekingcn/kkFileView/releases/tag/v4.3.0 -
解决 aspose 依赖问题:
- 注释掉配置的其他仓库
- 添加以下镜像配置:
<mirror> <id>aspose-maven-repository</id> <url>http://artifact.aspose.com/repo/</url> </mirror> - 添加必要的 jar 包
-
启动后访问:
http://127.0.0.1:8012
漏洞复现
构造恶意 ZIP 文件
使用以下 Python 脚本创建恶意 ZIP 文件(hack.zip):
import zipfile
if __name__ == "__main__":
try:
binary1 = b'test'
binary2 = b'test_Yu9'
zipFile = zipfile.ZipFile("hack.zip", "a", zipfile.ZIP_DEFLATED)
info = zipfile.ZipInfo("hack.zip")
zipFile.writestr("test", binary1)
zipFile.writestr(".AAA/flag", binary2)
zipFile.close()
except IOError as e:
raise e
注意:ZIP 文件中必须包含至少一个正常文件(如 test),以便创建 hack.zip_ 缓存文件。
利用步骤
- 上传恶意压缩包
- 点击预览
- 观察任意文件写入效果
利用思路
-
Linux 系统(高权限情况下):
- 写入计划任务实现反弹 shell
- 示例路径:
/etc/cron.d/evil
-
Windows 系统(高权限情况下):
- 写入启动目录实现持久化
- 示例路径:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\evil.bat
漏洞分析
漏洞入口
漏洞入口位于:
cn.keking.web.controller.OnlinePreviewController#onlinePreview
该方法根据文件 URL 获取文件属性信息,并选择合适的文件预览处理器进行预览处理。
关键处理流程
- 请求进入
CompressFilePreviewImpl#filePreviewHandle方法 - 调用
CompressFileReader#unRar方法处理压缩文件
漏洞点分析
在 CompressFileReader#unRar 方法中:
- 使用 SevenZip 库的
openInArchive方法打开压缩文件 - 通过
getSimpleInterface()获取压缩文件的简单接口 - 调用
getArchiveItems()获取压缩文件中所有项的列表 - 遍历处理压缩文件项时,未对文件路径进行安全校验,直接拼接创建文件
关键问题:缺乏对解压路径的合法性检查,导致可以写入任意位置。
修复建议
- 升级到最新安全版本
- 临时缓解措施:
- 对解压路径进行规范化处理
- 检查解压路径是否在预期目录内
- 禁止路径中包含
../等穿越符号
参考资源
- kkFileView-v4.3.0-RCE-POC
- 官方更新日志和安全公告
总结
该漏洞利用简单但危害严重,攻击者可通过上传恶意构造的 ZIP 文件实现任意文件写入,进而可能导致远程代码执行。建议受影响用户立即升级或采取缓解措施。