漏洞复现

影响版本:
E-cology 7.0
E-cology 8.0
E-cology 8.1
E-cology 9.0

直接在网站根目录后加入组件访问路径 /weaver/bsh.servlet.BshServlet/,如下图在victim上执行了命令“ipconfig.exe”

漏洞分析

漏洞出现在e-cology的组件beanshell上,由于beanshell这个接口可被未授权访问,同时这个接口在接受用户请求时未进行相应过滤,最终导致远程命令执行

那beanshell是什么呢?
官网地址如下:https://github.com/beanshell/beanshell,里面有关于它的介绍,简单来说,就是一个微型的java解释器,可嵌入到其他程序中,用于动态的执行java代码,类似于csharp中的动态编译特性,我们通过一个例子来了解beanshell,如下图

如上例子中,首先实例化了类Interpreter并将返回的对象赋给变量in,然后调用对象的方法eval,动态执行字符串(前提需要字符串符合java语法),接着为变量boolean设置值,最后输出变量boolean的值
在beahshell中,有多种方式可以动态执行字符串,eval只是其中一中,如下图是其他能动态执行字符串的方法

(额外说一句,其实这也给了我们一个思路,在挖beanshell的漏洞时,可以通过搜索这几个关键字,来快速定位可能存在漏洞的代码)

回到组件beanshell上,使用jadx反编译jar包,由于访问的组件路径为/weaver/bsh.servlet.BshServlet/,所以我们先查看一下类bsh.servlet.BshServlet,如下图

经过查看这个类,我们看到在方法doGet()中获取了“bsh.script”等参数,并将参数bsh.script的值赋给变量parameter,如下图

如下图,由于在漏洞利用时,我们是在script处输入的指令,所以有理由怀疑此处的script输入框,就是上述的参数bsh.script

可我们在提交时使用的method是post,继续查看代码,发现方法doPost()只是封装了方法doGet(),如下图

查看方法doGet()中的代码,发现将变量传递给了方法evalScript,如下图

双击方法evalScript(),发现正是方法doPost()下面的那个方法,如下图

在方法evalScript()中,调用了方法eval(),执行了我们之前传入的字符串,如下图

其中interpreter是类Interpreter实例化的对象,如下图

正如我们在前面的例子中所展示,类Interpreter实例化后,调用方法eval(),动态的执行了传递过去的字符串

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖