漏洞描述
Spring 框架为任何类型的部署平台上基于Java 的现代企业应用程序提供了全面的编程和配置模型。
攻击者可以绕过此漏洞,因为Spring Cloud的无服务器框架Spring Cloud Function中的RoutingFunction类的apply方法将请求头中的“spring.cloud.function.routing-expression”参数处理为Spel表达式。可能性。执行任意代码。
利用条件
3.0.0.RELEASE=Spring 云函数=3.2.2
环境搭建
在官网新建一个Spring boot项目(https://start.spring.io/),使用idea启动。
修改pom.xml配置文件
?xml 版本=\’1.0\’ 编码=\’UTF-8\’?
项目xmlns=\’http://maven.apache.org/POM/4.0.0\’ xmlns:xsi=\’http://www.w3.org/2001/XMLSchema-instance\’
xsi:schemaLocation=\’http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\’
模型版本4.0.0/模型版本
家长
groupIdorg.springframework.boot/groupId
artifactId Spring Boot 入门父级/artifactId
版本2.6.5/版本
relativePath/!– 从存储库中查找父级–
/父级
groupIdcom.example/groupId
artifactIddemo/artifactId
版本0.0.1-快照/版本
名称演示/名称
描述Spring Boot 演示项目/描述
特性
java.version17/java.version
spring-cloud.version2021.0.1/spring-cloud.version
/财产
依赖关系
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-function-context/artifactId
/依赖
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter/artifactId
/依赖
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-task/artifactId
/依赖
依赖
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-test/artifactId
范围测试/范围
/依赖
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-function-webflux/artifactId
/依赖
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-function-dependency/artifactId
版本3.2.2/版本
类型pom/类型
/依赖
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-function-web/artifactId
版本3.2.2/版本
/依赖
/依赖项
依赖管理
依赖关系
依赖
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-dependency/artifactId
版本${spring-cloud.version}/版本
类型pom/类型
范围导入/范围
/依赖
/依赖项
/依赖管理
建造
插入
插入
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-maven-plugin/artifactId
/插入
/插入
/建造
/项目
上次访问时间为http://127.0.0.1:8080。下一页显示成功。
【一一帮你安全学习,所有资源一一可用】
① 网络安全学习路线(文中介绍)
②20本渗透测试电子书
③ 安全攻防注释第357页
④50份安全面试指南
⑤安全红队入侵工具包
⑥ 网络安全必备物品(文中介绍)
⑦100个漏洞实例
⑧各大安防厂商内部视频资源
⑨CTF夺旗赛往期题解析
漏洞复现
漏洞原理
apply方法解析http header中的Spel表达式并引发Spel表达式注入。
查看官方差异
输入springframework/cloud/function/context/config/RoutingFunction 文件。进入调试模式并向apply() 方法添加断点。
一旦进入apply()方法,就会调用route(),判断输入是否是消息实例,判断函数是否为空,并填写else if来填充头部信息和键值spring. cloud 判断.function.routing-expression 中间是否有空格。然后再继续往下走。
进入springframework/cloud/function/context/config/RoutingFunction/functionFromExpression() 方法。
RoutingExpression 作为参数传递给springframework/expression/common/TemplateAwareExpressionParser/parseExpression() 方法。
在进入之前检查上下文是否有none 值。
springframework/expression/spel/standard/SpelExpressionParser/doPareExpression() 创建一个新的InternalSpelExpressionParser 类,并继续后续调用doPareExpression()。
在springframeworl/expression/spel/stand/InternalSpelExpressionParser/doParseExpression() 方法中,在tokenizer.process() 中在源代码和字节码之间确定标记并向下进行。
新建一个SpelExpression()来跟进
springframework/表达式/spel/标准/SpelExpression/SpelExpression()。
在SpelExpression() 方法中,表达式被赋值给this.expression 并返回到springframework/expression/spel/standard/SpelpressionParser/doParseExpression() ,然后返回到springframework/expression/common/TemplateAwareExpressionPareser/pareExpression() 。返回
springframework/cloud/function/context/config/RoutingFunction/functionFromExpression()
functionFromExpression() 方法包含MessageUtils.toCaseInsensitiveHeadersStructure()。
调用MessageStructureWithCaseInsensitiveHeaderKeys() 并进入putAll() 方法以检索消息中的标头信息。
最后输入漏洞触发点。
漏洞测试
Payload结构可以参考官方测试用例。
这次,我创建了一个文件test.使用负载触摸/tmp/xxxxx
x.测试.测试。
#【网络安全】以上漏洞挖掘中Spring Cloud注入漏洞相关内容来源仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93169.html