某凌EKP未授权访问漏洞分析

admin 2024年5月14日23:10:53评论16 views字数 2379阅读7分55秒阅读模式

免费&进群

某凌EKP未授权访问漏洞分析
某凌EKP未授权访问漏洞分析

0x00 简介

X凌EKP是一款功能强大的企业协同办公平台,适用于各种规模的组织,旨在提高工作效率、促进团队协作,以及优化业务流程。它可以帮助组织更好地组织和管理工作,提高竞争力

0x01 漏洞概述

情报披露X凌EKP存在未授权访问漏洞,可以读取resource目录下的所有文件,包括日志请求信息

0x02 影响版本

V15等

0x03 漏洞复现

某凌EKP未授权访问漏洞分析

0x04 漏洞原理

spring.xml,存在匿名路径:/ui-ext/**

某凌EKP未授权访问漏洞分析

查看web.xml,对应的 Servlet 是 com.landray.kmss.web.servlet.RedirectServlet

某凌EKP未授权访问漏洞分析

经过一系列的 Filter 后请求到了RedirectServlet,跟进这个service方法

某凌EKP未授权访问漏洞分析

request.getContextPath()会获取项目名,然后替换成 “”,有的情况下Tomcat部署项目没有修改配置,带上了ekp的名字,这里会把它替换了
request.getRequestURI()获取的值为:/./ui-ext/./behavior,然后进行if判断,这里添加的/./刚好绕过判断,跟进this.redirect方法

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getRequestURI().replaceFirst(request.getContextPath(), "");
if (!url.endsWith(".theme.css") || !url.startsWith("/ui-ext/") && !url.startsWith("//ui-ext/")) {
this.redirect(request, response);
} else {
ThemeUtil.service(request, response);
}
}

redirect和getFileName方法:
getFileName:把项目名替换成“”,然后再把this.requestPath替换成“”,最后拼接this.forwardPath

/./ui-ext/./behavior替换掉/ui-ext/-->/../behavior
拼接返回filename-->file:c:/landray/kmss/resource/ui-ext//../behavior

通过拼接的/../刚好可以穿越到resource命目录,接着就是一系列的判断,然后使用new URL(fileName)读取文件/目录

private void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String fileName = this.getFileName(request);
String fileNameLower = fileName.toLowerCase();
if (fileNameLower.indexOf("%c0") < 0 && fileNameLower.indexOf("%00") < 0) {
if (fileNameLower.indexOf(".ini") >= 0) {
throw new FileNotFoundException("ini文件不允许被访问");
} else {
if (!this.anonymous && UserUtil.getKMSSUser(request).isAnonymous()) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
} else {
URLConnection conn = (new URL(fileName)).openConnection();
InputStream stream = null;
try {
stream = conn.getInputStream();
.......

读取文件
.......
} catch (FileNotFoundException var41) {
response.setStatus(404);
logger.error(fileName + "文件不存在", var41);
} catch (Exception var42) {
logger.error(request.getRequestURI(), var42);
} finally {
try {
if (stream != null) {
stream.close();
}
} catch (Exception var38) {
logger.error("关闭流错误!", var38);
}
}
}
}
} else {
throw new IOException("路径包含非法字符");
}
}
`

getFileName方法

private String getFileName(HttpServletRequest request) {
String req = request.getRequestURI().replaceFirst(request.getContextPath(), "");
req = req.replaceFirst(this.requestPath, "");
return this.forwardPath + req;
}

this.requestPath和this.forwardPath值如下:

某凌EKP未授权访问漏洞分析

同样的,因为Spring MVC默认会将多个斜杠(“/”)视为一个斜杠(“/”)来处理,也可以使用//ui-ext/这种方式进行绕过

某凌EKP未授权访问漏洞分析

0x05 修复方式

联系官方打补丁

原文始发于微信公众号(白帽子左一):某凌EKP未授权访问漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月14日23:10:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某凌EKP未授权访问漏洞分析https://cn-sec.com/archives/2059068.html

发表评论

匿名网友 填写信息