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