1、 什么是上传漏洞
上传漏洞是指应用系统在处理用户上传文件时,未对文件进行合法性验证,如文件名、扩展名等。同时如果上传文件的路径、文件名、扩展名成为用户可控数据,就会导致直接上传脚本或木马至系统服务器上,从而使攻击者控制服务器。
2、 上传漏洞的危害
攻击者上传脚本或木马文件至应用服务器,从而可直接控制服务器。
3、 上传漏洞的防守方法
上传漏洞的本质是攻击者将非法的文件上传至服务器从而达到攻击的目的。那么防守的本质就是校验上传文件的合法性及上传文件的隔离。
方法如下:
1、基于对象存储实现文件上传,即确保文件存储的安全性,又能保证隔离性。如各种公有云/私有云的文件储存服务。
2、禁止将文件(包含各种临时缓存文件)存储在Web应用程序部署目录下。
3、根据业务需求使用白名单策略限制文件上传后缀名,如业务侧使用excel导入数据时,仅允许用户上传xls、xlsx等excel类型的文件。
4、禁止上传html、htm、swf等可被浏览器解析的文件。
Java后端文件上传示例
//定义可上传文件后缀白名单
String[] suffixList=newString[]{"xls", "xlsx"};
//定义一个非web目录的文件上传路径
String uploadFilePath="/upload/excel";
//根据入参uploadFileParam获取上传文件名
String fileName=uploadFileParam.getFileName();
// 解析出文件后缀名,并进行字母小写转换
String suffixName=fileName.substring(fileName.lastIndexOf(".") +1,fileName.length()).toLowerCase();
//判断是文件后缀是否在白名单内
if(Arrays.asList(suffixList).contains(suffixName)) {
// 为上传文件生成随机文件名
String newFileName=UUID.randomUUID().toString().replace("-", "") +"."+suffixName;
//写文件并入库
doWriteFile();
} else {
//非EXCEL类型文件,禁止处理
return;
}