一、原理
文件上传漏洞(Unrestricted File Upload / File Upload Vulnerability)本质上是应用程序对用户上传的文件缺乏充分、有效的安全验证和限制,导致攻击者能够上传恶意文件(如WebShell、恶意脚本、木马程序等)到服务器上,并可能执行这些文件,从而完全或部分控制服务器、窃取数据、破坏系统或发起进一步攻击。
二、审计
文件上传的常见实现方式
1. 使用Spring MultipartFile 实现
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
File dest = new File("/upload/dir/" + fileName);
file.transferTo(dest);
return "上传成功";
}问题点分析
漏洞出现的点位 | 存在的风险 |
fileName | 用户可控,如果fileName包含路径遍历序列(如”../“),就可以读取该路径下的内容造成路径遍历漏洞 |
未验证文件类型(扩展名/内容) | 没有校验,用户可以上传任意类型的文件包括一些可执行脚本(.php、.jsp等) |
文件覆盖 | 如果服务器上已存在同名文件,这段代码会直接覆盖它,没有检查文件是否存在。 |
未设置安全权限 | 上传后的文件权限继承系统默认设置,没有显式设置文件权限(如移除执行权限) |
未限制文件大小 | 可以恶意上传大文件、Zip炸弹等使磁盘空间耗尽 |
2. 使用Apache Commons FileUpload(ServletFileUpload)实现
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = item.getName();
File file = new File("/upload/" + fileName);
item.write(file);
}
}问题点分析
漏洞出现的点位 | 存在的风险 |
fileName | 用户可控,如果fileName包含路径遍历序列(如”../“),就可以读取该路径下的内容造成路径遍历漏洞 |
未验证文件类型(扩展名/内容) | 没有校验,用户可以上传任意类型的文件包括一些可执行脚本(.php、.jsp等) |
文件覆盖 | 没有检查文件是否存在直接覆盖,可以通过覆盖/etc/passwd的方式直接添加root账户 |
未设置安全权限 | 上传后的文件权限继承系统默认设置,没有显式设置文件权限(如移除执行权限) |
未限制文件大小 | 可以恶意上传大文件、Zip炸弹等使磁盘空间耗尽 |
针对漏洞点修复
1.文件名可控/目录遍历
可以通过生成随机名存入服务器这个方法去解决这个问题
路径遍
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



