【攻防演练】某采购系统1day任意文件下载到RCE
字数 1327 2025-08-06 18:07:33

某采购系统1day漏洞分析与利用教学文档

0x01 漏洞概述

本文档详细分析某采购系统的1day漏洞,从任意文件下载到最终实现RCE的全过程。该漏洞影响多个站点,包含以下关键漏洞点:

  1. 任意文件下载漏洞
  2. 两个不同的任意文件上传漏洞
  3. 文件移动接口漏洞

0x02 任意文件下载漏洞分析

漏洞发现

前台附件下载功能URL格式:

/xxxx/downloadFiles?downloadInfo={files:[ 'uploadfiles/bd/doc/xxxxxx.pdf' ]}

测试发现可下载WEB-INF目录:

/xxxxx/downloadFiles?downloadInfo={files:['/WEB-INF/web.xml']}

批量下载接口分析

通过分析WcDownloadFilesServlet.class代码:

  1. 前端传入downloadInfo参数,处理后转为JSON
  2. JSON解析后传入downLoadFiles函数
  3. downLoadFiles函数逻辑:
    • 调用getAllFiles方法获取文件列表
    • 如果文件名包含?*等字符,会进行正则匹配
    • 否则拼接目录并递归解析,生成文件绝对路径数组fVector
    • 文件数量为1时调用downSimple下载单个文件
    • 多个文件则调用downZipFile压缩后下载

漏洞利用

打包下载WEB-INF目录:

/xxx/wcdownloadFiles?downloadInfo={files:['/WEB-INF/']}

0x03 任意文件上传漏洞分析

第一个上传漏洞分析

  1. 获取Web根目录并拼接路径:[Web Real Path]/uploadfiles/[savePath用户传入]
  2. 解析上传请求并保存文件
  3. 问题:互联网环境上传失败,但内网环境可利用

第二个上传漏洞分析(webUploadServlet)

在依赖的jar包中找到相关代码,处理POST请求时根据不同action执行不同操作。

uploadFile实现

  1. 处理上传请求:

    • 解析multipart请求
    • 获取文件名、文件内容等参数
  2. 拼接路径并上传:

    • 判断chunks参数不为空时,取chunk作为最终文件名
    • 这是一个关键点(可能是开发人员少写了字母's')

漏洞利用方法1

构造满足以下条件的数据包:

  • 设置action=uploadFile
  • 控制上传路径和文件名

Shell访问路径:

/uploadfiles/attach/chunk/test/tst.jsp

文件移动接口漏洞

发现checkChunk action分支,涉及文件操作:

  1. 将用户传入的fileUuid拼接到路径
  2. httpRequestfileUuidchunks值传入mergeFile函数
  3. 无论storePath写什么内容,最终保存的文件名都可控

漏洞利用方法

  1. 首先上传文件(此时因缺少chunks无法直接访问)
  2. 使用文件移动接口将文件移动到可访问位置

0x04 完整利用链

  1. 通过任意文件下载获取WEB-INF目录内容
  2. 分析代码找到上传漏洞点
  3. 利用第一个上传漏洞(内网环境)
  4. 或利用第二个上传漏洞+文件移动接口(互联网环境)
  5. 最终获取WebShell实现RCE

0x05 防御建议

  1. 对文件下载功能实施严格的路径校验
  2. 限制文件上传的目录和文件类型
  3. 修复文件名处理逻辑中的拼写错误
  4. 对文件移动操作实施权限检查
  5. 避免将敏感配置文件存放在Web可访问目录

0x06 总结

该案例展示了从黑盒测试到代码审计,再到最终漏洞利用的完整过程。关键在于:

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