[备份]Spring Cloud SpEL简单学习

介绍

最近spring-cloud-gateway出现RCE漏洞,主要是SpEL导致的

于是我随便找了下spring-cloud其他组件可能的SpEL漏洞

简单审计了几个框架,暂时写了三个组件的分析

 

Spring Cloud Gateway

可能利用点(1)

org/springframework/cloud/gateway/support/ShortcutConfigurable#getValue

可能利用点(2)

org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator#getRouteDefinitions

结论

显而易见,不可利用

因为SimpleEvaluationContext是安全的

新漏洞修复后加入的GatewayEvaluationContext也是安全的

 

Spring Cloud Turbine

可能利用点

org/springframework/cloud/netflix/turbine/CommonsInstanceDiscovery#getClusterName

初步结论

可能存在利用,因为使用了StandardEvaluationContext允许执行命令

进阶分析

阅读源码,不难发现表达式来自于配置文件

通过改配置文件即可实现RCE,在Eureka Server获取该实例名称时触发

 

Spring Cloud Spanner

可能利用点(1)

com/google/cloud/spring/data/spanner/core/mapping/SpannerPersistentEntityImpl#tableName

初步结论

阅读源码发现context定义如下,可以利用

进阶分析

这是一个表名

来自于Table注解

不可利用,因为表名在代码中写死,不可控

可能利用点(2)

com/google/cloud/spring/data/spanner/repository/query/SqlSpannerQuery#resolveSpelTags

初步结论

跟下代码寻找context类型,发现可能存在漏洞

进阶分析

阅读源码后,发现了类似于MyBatis那种在注解中写SQL的方式

因为只进行一次expression.getValue所以就算SQL语句中存在#{SPEL}也不会被解析,所以可以重点关注下其中for (Expression expression : expressions)中的expressions是怎么获取的

经过调试分析,不难发现这里会解析a #{b}这样的SPEL[a,b]这样,并没有什么操作空间(假设有什么操作空间,也是由开发者自定义SQL语句的,所以没有意义做进一步分析和绕过)

但假如这里采用了递归或者多次的SPEL解析并获取值会怎样呢?