根据官方给出的信息,漏洞的位置为ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
fileDownload方法
该方法使用了FileUtils的isValidFilename方法对fileName变量进行处理。跟进
isValidFilename方法获取filename变量,再使用FILENAME_PATTERN进行处理。
可以看到对filename变量进行了正则处理,但是未对路径穿越做限制。漏洞存在
那么是怎么修复的呢?接着看4.5.1版本
把函数由isValidFilename替换成了checkAllowDownload,跟进。
用if判断对路径穿越进行了处理。
对文件规则进行检查。首先看一下contains的作用
contains():检查该数据在该数组中是否存在,返回一个boolean值。
接着使用DEFAULT_ALLOWED_EXTENSION进行文件后缀的检查
最后调用了getFileType对文件名进行检查
lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
toLowerCase() 方法将字符串转换为小写。
4.5.1新增了几个方法:
FileUtils.checkAllowDownload方法、checkAllowDownload方法
FileTypeUtils类:getFileType(Filefile)、getFileType(StringfileName)