【攻防演练】某采购系统1day任意文件下载到RCE
字数 1327 2025-08-06 18:07:33
某采购系统1day漏洞分析与利用教学文档
0x01 漏洞概述
本文档详细分析某采购系统的1day漏洞,从任意文件下载到最终实现RCE的全过程。该漏洞影响多个站点,包含以下关键漏洞点:
- 任意文件下载漏洞
- 两个不同的任意文件上传漏洞
- 文件移动接口漏洞
0x02 任意文件下载漏洞分析
漏洞发现
前台附件下载功能URL格式:
/xxxx/downloadFiles?downloadInfo={files:[ 'uploadfiles/bd/doc/xxxxxx.pdf' ]}
测试发现可下载WEB-INF目录:
/xxxxx/downloadFiles?downloadInfo={files:['/WEB-INF/web.xml']}
批量下载接口分析
通过分析WcDownloadFilesServlet.class代码:
- 前端传入
downloadInfo参数,处理后转为JSON - JSON解析后传入
downLoadFiles函数 downLoadFiles函数逻辑:- 调用
getAllFiles方法获取文件列表 - 如果文件名包含
?、*等字符,会进行正则匹配 - 否则拼接目录并递归解析,生成文件绝对路径数组
fVector - 文件数量为1时调用
downSimple下载单个文件 - 多个文件则调用
downZipFile压缩后下载
- 调用
漏洞利用
打包下载WEB-INF目录:
/xxx/wcdownloadFiles?downloadInfo={files:['/WEB-INF/']}
0x03 任意文件上传漏洞分析
第一个上传漏洞分析
- 获取Web根目录并拼接路径:
[Web Real Path]/uploadfiles/[savePath用户传入] - 解析上传请求并保存文件
- 问题:互联网环境上传失败,但内网环境可利用
第二个上传漏洞分析(webUploadServlet)
在依赖的jar包中找到相关代码,处理POST请求时根据不同action执行不同操作。
uploadFile实现
-
处理上传请求:
- 解析multipart请求
- 获取文件名、文件内容等参数
-
拼接路径并上传:
- 判断
chunks参数不为空时,取chunk作为最终文件名 - 这是一个关键点(可能是开发人员少写了字母's')
- 判断
漏洞利用方法1
构造满足以下条件的数据包:
- 设置
action=uploadFile - 控制上传路径和文件名
Shell访问路径:
/uploadfiles/attach/chunk/test/tst.jsp
文件移动接口漏洞
发现checkChunk action分支,涉及文件操作:
- 将用户传入的
fileUuid拼接到路径 httpRequest、fileUuid和chunks值传入mergeFile函数- 无论
storePath写什么内容,最终保存的文件名都可控
漏洞利用方法
- 首先上传文件(此时因缺少
chunks无法直接访问) - 使用文件移动接口将文件移动到可访问位置
0x04 完整利用链
- 通过任意文件下载获取WEB-INF目录内容
- 分析代码找到上传漏洞点
- 利用第一个上传漏洞(内网环境)
- 或利用第二个上传漏洞+文件移动接口(互联网环境)
- 最终获取WebShell实现RCE
0x05 防御建议
- 对文件下载功能实施严格的路径校验
- 限制文件上传的目录和文件类型
- 修复文件名处理逻辑中的拼写错误
- 对文件移动操作实施权限检查
- 避免将敏感配置文件存放在Web可访问目录
0x06 总结
该案例展示了从黑盒测试到代码审计,再到最终漏洞利用的完整过程。关键在于:
- 通过任意文件下载获取代码
- 深入分析代码逻辑发现多个漏洞点
- 组合利用多个漏洞实现最终目标
- 内网环境中漏洞往往更容易利用