根據官方給出的信息,漏洞的位置為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)