springblade框架(又称为BladeX)是基于spring微服务二次开发的框架,广泛应用于java后端的开发中,比如哈尔滨新中新公司的慧新e校系统就是基于springblade开发的。
漏洞版本:springblade v3.1.0版本及之前都存在这个漏洞
低版本的blade-gateway命令执行漏洞,本质上还是2022年的那个spring-cloud-Gateway-RCE漏洞
漏洞解析
blade-gateway是用于转发springblade请求的模块,直接请求会显示如下:
Failed to handle request
使用3.1.3版本的springblade的抓包进行测试
新增一条路由/actuator/gateway/routes/hacktest1
在value中写入spel表达式,执行whoami的命令
blade-gateway在新建路由后,请求/actuator/gateway/refresh刷新就执行了路由
但是gateway日志中报错Type cannot be found
表达式中替换成processbuilder后执行也会报错
下断点追踪,进入getValue方法后
进入到下面这一步后
Object result = this.ast.getValue(expressionState);
直接抛出报错信息type cannot be found
查看新版本的spring cloud gateway包版本跟随blade的版本,也为3.1.3
下载旧版3.0.0的springblade,启动blade-gateway服务进行请求
此时spring cloud gateway跟随springblade版本,为存在漏洞的3.0.0版本
请求执行命令弹本地计算器
请求执行whoami命令
请求路由读取输出信息
新旧版本对比下
追踪代码,看新版和旧版有什么区别
实际上没有太大变化,差异可能就出在多的一行代码当中
public static final String SPRING_EXPRESSION_COMPILER_MODE_PROPERTY_NAME = "spring.expression.compiler.mode";
配置了编译器的系统属性
在互联网上搜索该编译模式下出现的历史问题,会发现它不支持赋值的表达式
类似
用BufferedReader
对象调用readLine()
方法来读取进程的输出,会被认为是一个赋值操作,除此以外新版还可能还限制了调用的方法等,导致在代码中无法执行命令相关的表达式。
END
关注HackingWiki漏洞感知
了解更多安全相关内容
原文始发于微信公众号(HackingWiki漏洞感知):Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论