Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

admin 2024年3月7日17:22:27评论67 views字数 1301阅读4分20秒阅读模式

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

springblade框架(又称为BladeX)是基于spring微服务二次开发的框架,广泛应用于java后端的开发中,比如哈尔滨新中新公司的慧新e校系统就是基于springblade开发的。

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

漏洞版本:springblade v3.1.0版本及之前都存在这个漏洞

低版本的blade-gateway命令执行漏洞,本质上还是2022年的那个spring-cloud-Gateway-RCE漏洞

漏洞解析

blade-gateway是用于转发springblade请求的模块,直接请求会显示如下:

Failed to handle request

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

使用3.1.3版本的springblade的抓包进行测试

新增一条路由/actuator/gateway/routes/hacktest1

在value中写入spel表达式,执行whoami的命令

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

blade-gateway在新建路由后,请求/actuator/gateway/refresh刷新就执行了路由

但是gateway日志中报错Type cannot be found

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

表达式中替换成processbuilder后执行也会报错

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

下断点追踪,进入getValue方法后

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

进入到下面这一步后

Object result = this.ast.getValue(expressionState);

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

直接抛出报错信息type cannot be found

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

查看新版本的spring cloud gateway包版本跟随blade的版本,也为3.1.3

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

下载旧版3.0.0的springblade,启动blade-gateway服务进行请求

此时spring cloud gateway跟随springblade版本,为存在漏洞的3.0.0版本Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

请求执行命令弹本地计算器

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

请求执行whoami命令

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

请求路由读取输出信息

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

新旧版本对比下

追踪代码,看新版和旧版有什么区别

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

实际上没有太大变化,差异可能就出在多的一行代码当中

public static final String SPRING_EXPRESSION_COMPILER_MODE_PROPERTY_NAME = "spring.expression.compiler.mode";

配置了编译器的系统属性

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

在互联网上搜索该编译模式下出现的历史问题,会发现它不支持赋值的表达式

Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

各类命令执行的表达式,基本包含了赋值操作和依赖转换服

类似

#{new java.io.BufferedReader(new java.io.InputStreamReader(new ProcessBuilder("cmd", "/c", "whoami").start().getInputStream(), "gbk")).readLine()}

用BufferedReader对象调用readLine()方法来读取进程的输出,会被认为是一个赋值操作,除此以外新版还可能还限制了调用的方法等,导致在代码中无法执行命令相关的表达式。

END

关注HackingWiki漏洞感知

了解更多安全相关内容

原文始发于微信公众号(HackingWiki漏洞感知):Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月7日17:22:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Springblade <=v3.1.0版本blade-gateway命令执行漏洞解析http://cn-sec.com/archives/2555504.html

发表评论

匿名网友 填写信息