Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SpringBoot框架SpEL表达式注入漏洞复现与原理分析

SpringBoot框架SpEL表达式注入漏洞复现与原理分析

作者头像
雪痕@
发布于 2022-10-31 02:46:32
发布于 2022-10-31 02:46:32
2.1K00
代码可运行
举报
文章被收录于专栏:代码审计代码审计
运行总次数:0
代码可运行

前言

这是2016年的一个洞,利用条件是至少知道一个触发 springboot 默认错误页面的接口及参数名。

影响版本:1.1.0-1.1.12 1.2.0-1.2.7 1.3.0

修复方案:升级版本

环境搭建

下载链接:https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-spel-rce

用idea打开之后配置一下,如下图:

然后启动访问出现如下页面,代表搭建成功。

漏洞复现

访问:http://localhost:9091/article?id={9*9} ,可以发现{9*9}的SpEL表达式进行了解析,随后将该表达式的运行的结果进行了返回,如下图。

现在尝试弹出计算器,访问:http://localhost:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x63,0x61,0x6c,0x63}))}

成功弹出,如下图:

调试分析

为什么会出现这情况呢,这是因为springboot返回错误页面的时候提供了详细信息,这些信息包括

错误status("status"->500)、时间戳("timestamp"->"Fri Dec.....")、错误信息("error"->"Internal Server Error")、和用户输入的参数("message"->"test"),然后后端渲染视图时,会解析错误模板中的参数名。然后拿到对应的参数值,通过函数检查参数值中是否存在${},如果存在则去除,然后传入SpEL引擎进行解析。模板内容如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
   <body>
       <h1>Whitelabel Error Page</h1>
       <p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>
       <div id='created'>${timestamp}</div>
       <div>There was an unexpected error (type=${error}, status=${status})</div>
       <div>${message}</div>
    </body>
</html>

程序会判断模板中每个{}的位置,然后将参数名一个一个取出来后传入spel引擎,解析参数名对应的值。这里就是漏洞的触发点,假如我输入{payload},spel取出来payload后进行解析,然后触发漏洞。触发点如下:

浏览器访问http://localhost:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x63,0x61,0x6c,0x63}))},现在开始调试,首先会将map的值传入,context的rootObject中,之后以this.templatethis.resolver为参数调用replacePlaceholders方法,如下图:

this.template的内容就是上文的错误模板,跟进replacePlaceholders方法 ,进入PropertyPlaceholderHelper文件。

继续跟进parseStringValue方法

分析一下代码,首先StringBuilder将strVal转为字符串,并赋值给result,接着判断result中${}位置,结果为157、168,然后通过substring截取157和168的中间值,并赋值给placeholder,本次的值为"timestamp",然后将placeholder作为第一个参数,再次调用本方法。结果如下图:

strVal的值变为timestamp,所以在indexOf判断时,由于没出现${,所以变为了-1,跳过了while循环,直接执行下边的return result.toString();

继续跟进,下一步是调用resolvePlaceholder方法,此函数的作用是查找this.context中对应参数的值并返回,如下图:

发现拿到了时间戳"timestamp" -> "Wed Oct 19 00:38:36 CST 2022",然后赋值给propVal,此时不为空,进入下一个if循环,再次调用parseStringValue。

接着进行replace替换,将原来的${timestamp}处的值替换成了 Wed Oct 19 00:38:36 CST 2022,最后return result.toString();返回,如下图:

然后寻找template中的下一个参数位,这次的参数是error,流程与上面基本一样,这里不再细致分析。

接着第三个参数是status,同理

最后是第四个参数message,重点来了,这个值是用户输入的。接着分析,跟进parseStringValue方法

拿到message对应的值,也就是用户输入的payload

赋值给propVal,接着调用parseStringValue

这次调用去除了${}

最后进入resolvePlaceholder,成功执行T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x63,0x61,0x6c,0x63})),弹出计算器,分析结束。

参考文章

https://www.cnblogs.com/litlife/p/10183137.html

https://www.cnblogs.com/zpchcbd/p/15536569.html

https://blog.csdn.net/haduwi/article/details/126326511

https://blog.csdn.net/weixin_54902210/article/details/124533353

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java spel_SPEL表达式注入-入门篇
Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。同时因为SpEL是以API接口的形式创建的,所以允许将其集成到其他应用程序和框架中。
全栈程序员站长
2022/10/01
2.5K0
java spel_SPEL表达式注入-入门篇
spel表达式注入[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 pom.xml中添加 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.0.8.RELEASE</version> </dependency> 测试 package com.example.demo.SpELTest; import org.springframework.exp
全栈程序员站长
2022/10/01
7690
spel表达式注入[通俗易懂]
spring boot (whitelabel error page SpEL RCE) 漏洞复现
雨笋教育小编来分享干货了,近期审核关系,大家先看为尽,少一篇是一篇了。 利用条件: spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0 至少知道一个触发 spring
雨笋教育
2021/09/15
4.4K1
spring boot (whitelabel error page SpEL RCE) 漏洞复现
Spring Boot SpEL表达式注入
Spring表达式语言(Spring Expression Language,简称SpEL)是一种功能强大的表达式语言,它可以用于在Spring配置中动态地访问和操作对象属性、调用方法、执行计算等,SPEL的设计目标是让Spring应用程序中的bean配置和运行时操作更加灵活和可扩展,其语法和OGNL、MVEL等表达式语法类似,本篇文章主要用于填补JAVA安全系列中的SPEL表达式注入专题
Al1ex
2024/12/27
1090
Spring Boot SpEL表达式注入
Spring Boot 相关漏洞学习资料
Spring Boot 相关漏洞学习资料,利用方法和技巧合集,黑盒安全评估 check list
瓦都剋
2020/08/07
4.2K0
SpringBoot相关漏洞学习资料,利用方法和技巧合集
其他一些可能会遇到的 swagger、swagger codegen、swagger-dubbo 等相关接口路由:
BigYoung小站
2023/01/30
2.2K0
漏洞复现-Spring Cloud Function SpEL表达式注入
Spring Cloud Function 是基于Spring Boot 的函数计算框架(FaaS),当其启用动态路由functionRouter时, HTTP请求头 spring.cloud.function.routing-expression参数存在SPEL表达式注入漏洞,攻击者可通过该漏洞进行远程命令执行
hyyrent
2022/12/26
7560
漏洞复现-Spring Cloud Function SpEL表达式注入
SpringCloud Function SPEL表达式 RCE 漏洞分析
title: SpringCloud Function SPEL RCE analysis date: 2022-03-29 12:46:03 tags:
黑伞安全
2022/03/31
7460
SpringCloud Function SPEL表达式 RCE 漏洞分析
Spring Cloud Function SpEL 注入
# 此模块需要 Metasploit:https://metasploit.com/download
Khan安全团队
2022/04/21
3210
Apollo与SpringBoot整合原理深度剖析
AbstractBeanFactory的embeddedValueResolvers集合中StringValueResolver 的注册时机是什么呢?
大忽悠爱学习
2023/05/23
1K0
Apollo与SpringBoot整合原理深度剖析
Java代码审计之SpEL表达式注入
Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言、用于在运行时查询和操作对象图;语法上类似于 Unified EL,但提供了更多的特性,特别是方法调用和基本字符串模板函数。SpEL 的诞生是为了给 Spring 社区提供一种能够与 Spring 生态系统所有产品无缝对接,能提供一站式支持的表达式语言。
FB客服
2019/05/09
2K0
Java代码审计之SpEL表达式注入
Spring Security OAuth RCE (CVE-2016-4977) 漏洞分析
Author: p0wd3r (知道创宇404安全实验室) Date: 2016-10-17 0x00 漏洞概述 1.漏洞简介 Spring Security OAuth是为Spring框架提供安全认证支持的一个模块,在7月5日其维护者发布了这样一个升级公告,主要说明在用户使用Whitelabel views来处理错误时,攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。漏洞的发现者在10月13日公开了该漏洞的挖掘记录。 2.漏洞影响 授权状态下远程命令执行 3.影响版本 2.0.0 to 2.0
Seebug漏洞平台
2018/03/29
1.7K0
Spring Security OAuth RCE (CVE-2016-4977) 漏洞分析
Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)
Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947) 一、环境搭建 https://github.com/vulhub/vulhub/tree/master/spring/CVE-2022-22947 docker-compose up -d UzJuMarkDownImageimage-20220304103612832.png UzJuMarkDownImageimage-20220304103622903.png 二、漏洞复现
UzJu@菜菜狗
2022/04/25
6100
Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)
SPEL表达式_什么是EL表达式
最近在搞项目的自定义流程,主流的流程引擎flowable不能很好的支撑业务需求,再考虑到后期的拓展,部门经理说让自己搞一套。 这里玩SpEL表达式是为了解决业务流向判断的 [条件表达式] 问题 仿佛记得java是有自定义表达式的,昨儿翻阅书籍目录却没有找到,可能是我记错了吧(如果有知道的朋友请留言,颇为感谢)。 那就直接用SpEL表达式吧,早上查阅了下网上的资料,下面这篇文章挺全的,遂转载一下 (copy过来添加了锚点定位,方便以后查阅) 示例1(统计的计算公式交给客户自己输入):
全栈程序员站长
2022/10/01
2.3K0
SPEL表达式_什么是EL表达式
Springboot自定义注解,支持SPEL表达式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/15
7890
Spring框架漏洞学习
自从算法和操作系统考试以来对Java的学习就摆的很严重了可以说,今天就从Spring的框架漏洞来学习一下Java吧…
h0cksr
2023/05/17
1.4K0
如何通过aop+spel表达式玩转出不一样的切面实现
Spring表达式语言(简称“ SpEL”)是一种功能强大的表达式语言,支持在运行时查询和操作对象图。
lyb-geek
2022/01/07
3740
如何通过aop+spel表达式玩转出不一样的切面实现
玩转Spring中强大的spel表达式!
Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。
路人甲Java
2020/08/10
29.5K0
玩转Spring中强大的spel表达式!
Spring全家桶各类RCE漏洞浅析
Spring发展到现在,全家桶所包含的内容非常庞大,这里主要介绍其中关键的5个部分,分别是spring framework、 springboot、 spring cloud、spring security、spring mvc。其中的spring framework就是大家常常提到的spring, 这是所有spring内容最基本的底层架构,其包含spring mvc、springboot、spring core、IOC和AOP等等。Spring mvc就是spring中的一个MVC框架,主要用来开发web应用和网络接口,但是其使用之前需要配置大量的xml文件,比较繁琐,所以出现springboot,其内置tomcat并且内置默认的XML配置信息,从而方便了用户的使用。下图就直观表现了他们之间的关系。
FB客服
2021/01/08
2.1K0
Spring全家桶各类RCE漏洞浅析
Spring高手之路3——揭秘Spring依赖注入和SpEL表达式
我们在前面的文章中已经使用过XML进行setter方法的属性注入了,下面让我们再来回顾一下:
砖业洋__
2023/06/10
9480
Spring高手之路3——揭秘Spring依赖注入和SpEL表达式
相关推荐
java spel_SPEL表达式注入-入门篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验