电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 636 人浏览分享

Spring Cloud Function SPEL表达式注入漏洞

[复制链接]
636 0
漏洞描述

Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。

Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的
spring.cloud.function.routing-expression”参数作为 Spel 表达式进行处理,造成Spel表达式注入,攻击者可通
过该漏洞执行任意代码。

利用条件

3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2

环境搭建

在官方网页新建一个 Spring boot 项目(https://start.spring.io/)、使用idea启动。

QQ截图20220517151715.png

修改 pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o
rg/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apac
he.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.6.5</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.example</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>
   <properties>
      <java.version>17</java.version>
      <spring-cloud.version>2021.0.1</spring-cloud.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-function-context</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-task</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-function-webflux</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-function-dependencies</artifactId>
         <version>3.2.2</version>
         <type>pom</type>
      </dependency>

      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-function-web</artifactId>
         <version>3.2.2</version>
      </dependency>
   </dependencies>
   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

最后访问 http://127.0.0.1:8080. 出现以下页面表示成功。

QQ截图20220517151837.png

漏洞复现

漏洞原理

apply方法会将http头部中的Spel表达式进行解析,从而造成Spel表达式注入。
查看官方diff(https://github.com/spring-cloud/spring-cloud-function/commit/0e8
9ee27b2e76138c16bcba6f4bca906c4f3744f)

66669.png

66668.png

进入springframework/cloud/function/context/config/RoutingFunction文件。进入调试模式将
断点添加到apply()方法。

339.png

进入到apply()方法后、会调用route() 在该方法中会去判读input是否为 message的实例,function 是否为空然
后进入else if 去获取头信息、获取key值 spring.cloud.function.routing-expression   、在中间会对有无空格做
判断 然后继续向下走。

338.png

会进入到springframework/cloud/function/context/config/RoutingFunction/functionFromExpression()方法。

336.png

routingExpression 会做为参数传入到  springframework/expression/common/TemplateAwar
eExpressionParser/parseExpression()方法中。

335.png

判读其context是否为none值 在进入
springframework/expression/spel/standard/SpelExpressionParser/doPareExpression() 会new 一个
InternalSpelExpressionParser 类调用 doPareExpression() 继续跟进。

334.png

在springframeworl/expression/spel/stand/InternalSpelExpressionParser/doParseExpression()方法中
会在tokenizer.process()中 对token进行 源码与字节码的判断操作、继续向下。

333.png

会new 一个SpelExpression() 跟进到

springframwork/expression/spel/standard/SpelExpression/SpelExpression()。

26.png

在SpelExpression()方法中会将将表达式赋值到 this.expression 继续跟进 return到 springframework/expre
ssion/spel/standard/SpelpressionParser/doParseExpression()、继续return到springframework/express
ion/common/TemplateAwareExpressionPareser/pareExpression()、return springframework/cloud/fu
nction/context/config/RoutingFunction/functionFromExpression()

19.png

在functionFromExpression()方法中会进入MessageUtils.toCaseInsensitiveHeadersStructure()。

18.png

调用MessageStructureWithCaseInsensitiveHeaderKeys(),进入到putAll()方法 获取message中头信息。

17.png

最后会进入漏洞触发点。

16.png

漏洞测试

Payload 的构造可以参考官方测试用例。

15.png

本次利用创建文件测试。使用payload  touch  /tmp/xxxxxx.test.test。

9.png

1.png

修复建议

官方已经发布漏洞补丁。(https://github.com/spring-cloud/spring-cloud-function/commit/0e8
9ee27b2e76138c16bcba6f4bca906c4f3744f)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.