MeterSphere未授权RCE
2023-02-10 18:00:40
代码分析
版本<=1.16.3
查看修复日志
https://github.com/metersphere/metersphere/pull/9135/commits/9927d2c587a2b388ee5d633f6cc31346df4415de
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/51d2c09b-f214-4eaf-8bf6-158f00b201aa.png)
将/plugin/** 这个路由的未授权删除了,全局搜/plugin定位到功能代码
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/63f757b1-1797-4a94-8f94-b4d78d82f811.png)
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/61882065-7f6c-4221-8f96-e66a0af97f92.png)
跟进add方法中的pluginService.editPlugin(file) ,
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/92cb7d5a-04a9-4e62-b0c3-ac01a40a3e51.png)
跟进
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/97c343ab-0a12-4aad-a7d0-64651553d493.png)
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/98a490ea-84c5-419c-ac8c-84fa95f2ee53.png)
在loadJar方法中使用URLClassLoader来加载jar包,将jar包的类加载进来;然后我们可以看到io.metersphere.controller.PluginController#customMethod中只有一行代码return pluginService.customMethod(request);
跟进去
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/ea86f425-35d2-46bb-85d9-abe962f5168e.png)
会调用指定类的customMethod方法,我们可以写一个恶意类然后定义一个customMethod然后来调用他
漏洞利用
1 | import java.io.ByteArrayOutputStream; |
编译后打包为jar
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/8ea5706d-3646-4db6-aa4a-320d2707e9e6.png)
新建文件上传表单
1 | <!DOCTYPE html> |
传上去后,调用customMethod方法,执行命令
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/d44419d8-8c60-4183-9386-34f2b24c1a83.png)
记录
classloader 与 Class.forname的区别
https://blog.csdn.net/wt520it/article/details/83014038
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/bb49290d-6e0b-4959-8066-e5c67d319557.png)
该处也可以将恶意代码写入到static代码块中,但仍需要利用customMethod来触发代码块中代码。
通过class.forname触发
![](/2022/05/14/MeterSphere%E6%9C%AA%E6%8E%88%E6%9D%83RCE/249b726a-fd90-4f18-b4ff-127840a332bc.png)