SpEL注入

Spring Expression Language (SpEL) 概述

Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。

使用Spring表达式接口进行表达式求值

以下代码介绍了SpEL API来评估字面字符串表达式Hello World!

message变量的值就是简单的Hello World!

EvaluationContext接口

EvaluationContext接口在评估表达式时用于解析属性、方法、字段,并帮助执行类型转换。有两个主要的现成实现:

  • StandardEvaluationContext。一个功能强大且高度可配置的EvaluationContext实现。此上下文使用所有适用策略的标准实现,基于反射来解析属性、方法和字段。

  • SimpleEvaluationContextEvaluationContext的基本实现,专注于基本的SpEL功能和自定义选项,针对简单的条件评估特别是数据绑定场景。

表达式支持定义Bean定义

SpEL表达式可以与基于XML或注解的配置元数据一起使用,用于定义BeanDefinitions。在这两种情况下,定义表达式的语法形式为#{ <expression string> }

基于XML的配置

您可以使用表达式设置属性或构造函数参数值。

基于注解的配置

@Value注解可以放在字段、方法和方法/构造函数参数上以指定默认值。

语言参考

SpEL注入

当用户控制的数据直接传递给SpEL表达式解析器时,会发生SpEL注入。例如,以下方法使用标准上下文来评估SpEL表达式:

因此,您可以通过发送以下POST请求来获得代码执行:

如果您可以访问源代码,请尝试使用以下关键字搜索易受攻击的代码:

  • SpelExpressionParserEvaluationContextparseExpression@Value("#{ <expression string> }")

  • #{ <expression string> }${<property>}T(<javaclass>)

如果源代码不可用,值得检查Spring Boot执行器提供的metricsbeans端点。这些端点可以扩展可用bean列表及其接受的参数。

此外,尝试在服务的不同元素中使用表达式:

  • 参数名称和值:

    • variable[<expression string>]=123

    • variable=123&<expression string>=123

    • {"<expression string>":"123"}

    • {"variable":"<expression string>"}

  • HTTP头部:

    • Cookie: cookie_name=<expression string>

    • Cookie: <expression string>=cookie_value

    • Private-Token: <expression string>

  • 等等。

您可以使用以下payload作为表达式字符串:

Spring boot whitelabel错误页面RCE

此漏洞需要以下条件:

  • Spring Boot版本1.1.0 - 1.1.121.2.0 - 1.2.71.3.0

  • 在Spring Boot中至少有一个接口触发默认的whitelabel错误页面

检查下一个Spring Boot应用程序:LandGrey/springboot-spel-rce。如果您向/article?id=hop发送请求,应用程序将返回代码为500的whitelabel错误。但是,如果您向/article?id=${7*7}发送请求,应用程序将返回计算值49的错误页面。发生这种情况是因为:

  1. Spring Boot使用org.springframework.util.PropertyPlaceholderHelper类处理错误中的URL参数

  2. PropertyPlaceholderHelper.parseStringValue方法解析URL参数

  3. ${}中包含的内容将被org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration类的resolvePlaceholder方法解析并作为SpEL表达式执行

因此,这导致RCE,您可以使用以下步骤执行任意命令:

  1. 使用下一个python脚本准备payload(此示例准备执行open -a Calculator命令的payload):

  2. id参数中发送payload:

  3. open -a Calculator将被执行

参考:

SimpleEvaluationContext ReDoS

SimpleEvaluationContext上下文阻止任意代码执行并写入错误消息。但是,您仍然可以利用ReDoS攻击。

参考

最后更新于