SPEL表达式及注入漏洞

SPEL基础
2.1、类型表达式

在SPEL中,使用 #{} 界定符被认为是SpEL表达式,可以使用相关变量、属性和方法等操作

2.2、类型表达式

T(type)用于获取一个类型的class对象。它的作用是让SpEL表达式在运行时获取指定的类型的Class对象,以便在表达式中可以使用该类的方法属性。

使用T(type)的语法格式为:T(package,ClassName),其中package是指类所在的包名,ClassName是类名,例如,要获取java.lang.String类的class对象,可以使用表达式T(java.lang.String)。

在SpEl中,同样可以使用T(type)来调用静态方法和属性,例如:T(java.lang.Math).PI表示获取Math类中的PI静态属性,T(java.lang.Math).random() 表示调用 Math 类中的 random() 静态方法。

需要注意的是,在使用T(type)操作符时,要确保指定的类型已经被加载,否则会抛出ClassNotFoundException异常。

2.3、SpEL 的 EvaluationContext 接口

在使用 SpEL 时,我们需要将表达式与 EvaluationContext 进行绑定,然后将表达式交给 SpEL 引擎执行。EvaluationContext 为 SpEL 引擎提供了上下文信息,使得 SpEL 引擎能够正确地解析表达式中的变量、函数等信息,从而求出表达式的结果

SimpleEvaluationContext 和 StandardEvaluationContext 都是 SpEL 提供的 EvaluationContext 的实现类

它们都提供了表达式求值所需的上下文信息,但是在具体实现方面略有不同

SimpleEvaluationContext 相对来说比较简单,它仅仅包含了变量解析器和类型转换器,不支持函数表达式。

而 StandardEvaluationContext 提供了更丰富的上下文信息,包括变量解析器、类型转换器和函数表达式等。同时, StandardEvaluationContext 还支持自定义函数和类加载器等高级功能。

通常情况下,如果只是简单的表达式求值,可以使用 SimpleEvaluationContext;如果需要使用函数表达式或自定义函数等高级功能,可以使用 StandardEvaluationContext

SPEL注入漏洞
1、漏洞注入原理

简单来说,当应用程序使用SpEL时,如果未能正确处理用户输入数据,攻击者可以在表达式中注入任意代码,并在应用程序的上下文执行它,进而造成命令执行等漏洞。

SpEL的EvaluationContext,其中StandardEvaluationContext 使用方法更加完整

因此触发SPEL注入漏洞的流程大致为:接收了用户的输入且未过滤等操作,将接收的参数使用StandardEvaluationContext来处理,并对表达式调用了getvalue()或setvalue()方法。

如上流程,后端接收了用户输入且为过滤,而攻击者精心构造攻击payload,即可实现命令执行等危险操作

2、代码示例

新建一个springboot项目,选择springweb

/*127.0.0.1:8080/spel/vul/? ex=T(java.lang.Runtime).getRuntime().exec(“calc”) */

package com.example.speldemo;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;

import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SpELdemo {
    /*127.0.0.1:8080/spel/vul/? ex=T(java.lang.Runtime).getRuntime().exec("calc") */
    @GetMapping("/spel/vuln")
    public String vul1(String ex){
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();//创建SPEL解析器
        //StandardEvaluationContext权限过大,可以执行任意代码,默认使用可以不指定
        EvaluationContext evaluationContext = new StandardEvaluationContext();//创建StandardEvaluationContext对象
        Expression exp = spelExpressionParser.parseExpression(ex);//解析用户传入的值
        return  exp.getValue(evaluationContext).toString();//使用exp.getvalue获取值
    }
}

经过调试发现,创建解析器,创建运行环境,解析传入值,最后获取值,上面的每一步对于触发spel注入漏洞都很重要,少一半都可能无法触发。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

56e.png)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-SAmuTvA7-1712859910447)]

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值