SpEL注入
Spring Expression Language (SpEL) 概述
Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。
使用Spring表达式接口进行表达式求值
以下代码介绍了SpEL API来评估字面字符串表达式Hello World!:
message变量的值就是简单的Hello World!。
EvaluationContext接口
EvaluationContext接口在评估表达式时用于解析属性、方法、字段,并帮助执行类型转换。有两个主要的现成实现:
StandardEvaluationContext。一个功能强大且高度可配置的
EvaluationContext实现。此上下文使用所有适用策略的标准实现,基于反射来解析属性、方法和字段。SimpleEvaluationContext。
EvaluationContext的基本实现,专注于基本的SpEL功能和自定义选项,针对简单的条件评估特别是数据绑定场景。
表达式支持定义Bean定义
SpEL表达式可以与基于XML或注解的配置元数据一起使用,用于定义BeanDefinitions。在这两种情况下,定义表达式的语法形式为#{ <expression string> }。
基于XML的配置
您可以使用表达式设置属性或构造函数参数值。
基于注解的配置
@Value注解可以放在字段、方法和方法/构造函数参数上以指定默认值。
语言参考
SpEL注入
当用户控制的数据直接传递给SpEL表达式解析器时,会发生SpEL注入。例如,以下方法使用标准上下文来评估SpEL表达式:
因此,您可以通过发送以下POST请求来获得代码执行:
如果您可以访问源代码,请尝试使用以下关键字搜索易受攻击的代码:
SpelExpressionParser、EvaluationContext、parseExpression、@Value("#{ <expression string> }")#{ <expression string> }、${<property>}、T(<javaclass>)
如果源代码不可用,值得检查Spring Boot执行器提供的metrics和beans端点。这些端点可以扩展可用bean列表及其接受的参数。
此外,尝试在服务的不同元素中使用表达式:
参数名称和值:
variable[<expression string>]=123variable=123&<expression string>=123{"<expression string>":"123"}{"variable":"<expression string>"}
HTTP头部:
Cookie: cookie_name=<expression string>Cookie: <expression string>=cookie_valuePrivate-Token: <expression string>
等等。
您可以使用以下payload作为表达式字符串:
Spring boot whitelabel错误页面RCE
此漏洞需要以下条件:
Spring Boot版本
1.1.0 - 1.1.12、1.2.0 - 1.2.7、1.3.0在Spring Boot中至少有一个接口触发默认的whitelabel错误页面
检查下一个Spring Boot应用程序:LandGrey/springboot-spel-rce。如果您向/article?id=hop发送请求,应用程序将返回代码为500的whitelabel错误。但是,如果您向/article?id=${7*7}发送请求,应用程序将返回计算值49的错误页面。发生这种情况是因为:
Spring Boot使用
org.springframework.util.PropertyPlaceholderHelper类处理错误中的URL参数PropertyPlaceholderHelper.parseStringValue方法解析URL参数${}中包含的内容将被org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration类的resolvePlaceholder方法解析并作为SpEL表达式执行
因此,这导致RCE,您可以使用以下步骤执行任意命令:
使用下一个python脚本准备payload(此示例准备执行
open -a Calculator命令的payload):在
id参数中发送payload:open -a Calculator将被执行
参考:
SimpleEvaluationContext ReDoS
SimpleEvaluationContext上下文阻止任意代码执行并写入错误消息。但是,您仍然可以利用ReDoS攻击。
参考
最后更新于