某rdm系统代码审计upload&download
字数 1314 2025-08-22 12:23:30

Java代码审计:文件上传与下载漏洞分析

前言

本文通过分析一个典型的Java Web应用中的文件上传(upload)和文件下载(download)功能,揭示其中存在的安全漏洞。审计过程采用最基本的代码审计方法,不依赖复杂工具,适合初学者学习。

文件上传漏洞分析

1. 入口定位

通过web.xml文件入手,发现两个可疑接口:

  • upload - 文件上传接口
  • download - 文件下载接口

2. 上传接口分析

找到处理文件上传的接口,重点关注getFilepath函数,该函数接收四个参数:

  • dir - 目录路径
  • name - 文件名
  • start - 分段上传起始位置
  • size - 分段大小

参数验证

  1. 检查dirname参数是否为空
  2. 验证startsize是否为有效的长整型数字
  3. 所有传入参数都经过Base64编码处理

安全校验函数

checkForbidName函数检查路径安全性:

public static boolean checkForbidName(String... names) {
    for (String name : names) {
        if (name.contains("..")) {
            return true; // 检测到路径穿越尝试
        }
    }
    return false;
}

如果路径中包含..,函数返回true并打印日志:"can not upload file name has '..'"

路径处理函数

  1. getPhyFolder - 获取物理目录路径
  2. getSubFolder - 根据分页参数构造子目录路径

最终返回包含完整物理路径和相对路径的字符串数组。

3. 漏洞复现

构造恶意请求包:

  1. dirname参数进行Base64编码
  2. 上传成功后返回文件路径
  3. 通过拼接相对路径和返回路径访问上传的文件
  4. 使用哥斯拉等工具连接上传的Webshell

文件下载漏洞分析

1. 下载接口分析

下载接口与上传接口类似,关键点:

  1. diraddressfileName参数同样使用Base64编码
  2. 使用相同的checkForbidName方法检查路径安全性
  3. getPhyFolder方法根据输入的dir构造物理路径

2. 下载流程

通过downloadFile函数进行文件下载,关键特征:

  • 如果进入else分支(第38行),响应头会包含:
resp.setHeader("Content-disposition", "attachment;filename=\"" + encodeFileName(fileName));

此特征可用于判断文件下载功能是否可用。

3. 漏洞验证

  1. 使用Yakit等工具发送测试请求
  2. 检查响应头是否包含Content-disposition字段
  3. 通过浏览器直接访问链接验证文件下载功能

防御建议

  1. 路径校验增强

    • 实现更严格的路径校验,不仅检查..,还应检查绝对路径等
    • 使用白名单机制限制可访问的目录
  2. 文件类型限制

    • 检查文件扩展名和MIME类型
    • 禁止上传可执行文件(如.jsp, .php等)
  3. 文件重命名

    • 上传文件使用随机生成的文件名
    • 避免保留原始文件名
  4. 权限控制

    • 确保上传目录没有执行权限
    • 设置适当的文件系统权限
  5. 日志记录

    • 记录所有上传/下载操作
    • 监控可疑活动

总结

通过本次审计,我们了解到:

  1. 文件上传功能的关键风险点在于路径校验不足
  2. 文件下载功能可能被滥用导致任意文件读取
  3. Base64编码参数不能替代安全校验
  4. 防御措施需要多层次、多角度考虑

代码审计时应特别关注文件操作相关的功能点,从参数处理、路径构造到最终的文件操作,每个环节都可能存在安全隐患。

Java代码审计:文件上传与下载漏洞分析 前言 本文通过分析一个典型的Java Web应用中的文件上传(upload)和文件下载(download)功能,揭示其中存在的安全漏洞。审计过程采用最基本的代码审计方法,不依赖复杂工具,适合初学者学习。 文件上传漏洞分析 1. 入口定位 通过 web.xml 文件入手,发现两个可疑接口: upload - 文件上传接口 download - 文件下载接口 2. 上传接口分析 找到处理文件上传的接口,重点关注 getFilepath 函数,该函数接收四个参数: dir - 目录路径 name - 文件名 start - 分段上传起始位置 size - 分段大小 参数验证 检查 dir 和 name 参数是否为空 验证 start 和 size 是否为有效的长整型数字 所有传入参数都经过Base64编码处理 安全校验函数 checkForbidName 函数检查路径安全性: 如果路径中包含 .. ,函数返回true并打印日志:"can not upload file name has '..'" 路径处理函数 getPhyFolder - 获取物理目录路径 getSubFolder - 根据分页参数构造子目录路径 最终返回包含完整物理路径和相对路径的字符串数组。 3. 漏洞复现 构造恶意请求包: 对 dir 和 name 参数进行Base64编码 上传成功后返回文件路径 通过拼接相对路径和返回路径访问上传的文件 使用哥斯拉等工具连接上传的Webshell 文件下载漏洞分析 1. 下载接口分析 下载接口与上传接口类似,关键点: dir 、 address 和 fileName 参数同样使用Base64编码 使用相同的 checkForbidName 方法检查路径安全性 getPhyFolder 方法根据输入的 dir 构造物理路径 2. 下载流程 通过 downloadFile 函数进行文件下载,关键特征: 如果进入else分支(第38行),响应头会包含: 此特征可用于判断文件下载功能是否可用。 3. 漏洞验证 使用Yakit等工具发送测试请求 检查响应头是否包含 Content-disposition 字段 通过浏览器直接访问链接验证文件下载功能 防御建议 路径校验增强 : 实现更严格的路径校验,不仅检查 .. ,还应检查绝对路径等 使用白名单机制限制可访问的目录 文件类型限制 : 检查文件扩展名和MIME类型 禁止上传可执行文件(如.jsp, .php等) 文件重命名 : 上传文件使用随机生成的文件名 避免保留原始文件名 权限控制 : 确保上传目录没有执行权限 设置适当的文件系统权限 日志记录 : 记录所有上传/下载操作 监控可疑活动 总结 通过本次审计,我们了解到: 文件上传功能的关键风险点在于路径校验不足 文件下载功能可能被滥用导致任意文件读取 Base64编码参数不能替代安全校验 防御措施需要多层次、多角度考虑 代码审计时应特别关注文件操作相关的功能点,从参数处理、路径构造到最终的文件操作,每个环节都可能存在安全隐患。