[漏洞复现]泛微e-mobile cdnfile文件读取漏洞分析复现

如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。

免责声明

本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。

漏洞简介

e-mobile可满足企业日常管理中的绝大部分管理需求, 诸如市场销售、项目、采购、研发、客服、财务、人事、行政等;同时e-mobile可帮助企业实现面向不同用户量身定制的移动办公入口,包括企业员工、供应商、代理商、 合作伙伴、投资费以及终端客户等整个供应链条上的关系主体,满足为企业全方位的移动办公需求。泛微e-mobile为企业提供成熟APP应用库,各应用组件之间通过信息调用实现高效协同。移动应用前台统一展现操作,后台多个系统支持,用户无需切换登陆,即可在移动终端实现 跨平台、跨系统的统一操作。攻击者可通过文件读取漏洞获取敏感信息。

漏洞分析

截取了下相关代码分析。

@GetMapping({"/client/cdnfile/**"})
@ResponseBody
public void getCdnFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
	String servletPath = StringUtils.defaultIfBlank(request.getServletPath(), "");  // 获取请求路径,没有则为空
	if (servletPath.contains("?")) {
		servletPath = servletPath.split("?")[0];
	}  // 判断是否传参,只获取路径部分

	if (servletPath.contains("/client/cdnfile/")) {
		servletPath = servletPath.substring(servletPath.indexOf("/client/cdnfile/"));
		servletPath = servletPath.replace("/client/cdnfile/", "");
	}  // 截去/client/cdnfile/部分

	File file = null;
	String fileName = "";
	String mimeType = "";
	if (servletPath.startsWith("3")) {  // 处理3开头的路径,基于32位fileId获取文件
		String fileId = servletPath.substring(1, 33);
		SysBaseFileEntity baseFile = FileUtils.getFileInfo(fileId);
		if (baseFile == null) {
			response.sendRedirect("/common/images/ecfiledownloadpd.png");
			return;
		}

		if (StringUtils.isNotBlank(baseFile.getPath())) {
			file = new File(baseFile.getPath());
		}

		if ((file == null || !file.exists()) && (new Integer(1)).equals(baseFile.getBackupStatus()) && StringUtils.isNotBlank(baseFile.getBackupPath())) {
			file = new File(baseFile.getBackupPath());
		}

		fileName = StringUtils.defaultIfBlank(baseFile.getName(), "");
		mimeType = baseFile.getContentType();
	} else {
		if (servletPath.startsWith("1")) {  // 处理1开头的路径,替换处理/
			if (!servletPath.contains("7upload")) {
				servletPath = servletPath.replaceFirst("/", ":\\\\");
			}

			servletPath = servletPath.replaceAll("/", "\\\\");
		}

		servletPath = servletPath.substring(1);  // 删出第一个字符
		if (servletPath.startsWith("7upload")) {  // 如果路径以 7upload 开头,则获取上传路径的配置,并拼接完整路径
			SysBaseSettingEntity baseSetting = SysCacheUtils.getBaseSetting();
			servletPath = servletPath.replaceFirst("7upload", "");
			servletPath = baseSetting.getUploadPath() + servletPath;
		} else if (servletPath.contains(":") && !servletPath.contains(":\\")) {
			servletPath = servletPath.replace(":", ":\\");
		}

		file = new File(servletPath);
		if (file.isDirectory()) {  // 如果是目录,则获取该目录下的第一个文件进行处理
			File[] fs = file.listFiles();
			if (fs.length > 0) {
				file = fs[0];
			}
		}

		fileName = StringUtils.defaultIfBlank(file.getName(), "");
		Path path = file.toPath();
		mimeType = Files.probeContentType(path);
	}

	if (StringUtils.isBlank(request.getHeader("Range"))) {  // 处理文件下载
		FileUtils.normalRender(request, response, new FileInputStream(file), file.length(), fileName, mimeType);
	} else {
		FileUtils.rangeRender(request, response, new FileInputStream(file), file.length(), fileName, mimeType);
	}

	if (file.getAbsolutePath().startsWith(FileUtils.getTempFileDir())) {  // 清理文件
		org.apache.commons.io.FileUtils.forceDelete(file.getParentFile());
	}

}

漏洞复现

泛微e-mobile 6.0远程命令执行漏洞是指泛微e-mobile 6.0版本中存在的一种安全漏洞,攻击者可以利用该漏洞通过远程方式执行恶意命令,从而获取系统权限并对系统进行非法操作。 该漏洞的产生是因为泛微e-mobile 6.0在接收用户输入时没有正确地过滤或验证输入的内容,导致攻击者可以通过构造恶意请求向系统发送包含恶意命令的数据,进而执行指定的操作。 攻击者可以通过利用该漏洞执行一系列恶意操作,如获取系统权限、窃取敏感信息、篡改系统配置和数据等。由于该漏洞的严重性,攻击者可以对系统进行任意操控,对目标系统造成严重的威胁和损害。 为了防止该漏洞的利用,用户和系统管理员可以采取以下防护措施: 1. 及时升级:建议用户及时升级泛微e-mobile至最新版本,以确保系统安全性。 2. 配置安全策略:通过配置系统安全策略,限制远程访问权限,尽量减少攻击面。 3. 安全加固:加强服务器的安全配置,包括访问控制、强化密码策略、防火墙等措施。 4. 审计系统日志:定期审计系统日志,及时发现异常活动,以便采取适当的应对措施。 5. 安全培训:提高员工的安全意识,加强信息安全培训,避免因人为操作造成漏洞被利用。 总之,对于泛微e-mobile 6.0远程命令执行漏洞,用户和系统管理员应该保持警惕,及时采取相应的安全防护措施,以保护系统的安全和稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值