Java代码审计---SpEL表达式注入

devtools/2024/10/21 5:54:50/

简单了解

SpEL(Spring Expression Language) 是 Spring 中的表达式语言,用于在运行时评估和处理表达式。它提供了一种灵活的方式来访问和操作对象的属性、方法和其他表达式。SpEL可以用于配置文件、注解、XML 配置等多种场景,用于实现动态的、可配置的行为。它支持常见的表达式操作,如算术运算、逻辑运算、条件判断、集合操作等,并且可以与 Spring 框架的其他功能整合使用。

由于SpEL具有代码调用,我们可以通过SpEL注入来执行系统命令,进而导致RCE漏洞

SpEL格式

SpEL有多种格式

#{expression}

这是 SpEL 最常见的格式。在 XML 配置文件中,可以使用 #{} 包裹表达式来引用 SpEL 表达式。例如:

java"><property name="name" value="#{person.name}" />

${expression}

种格式通常用于读取属性文件中的值,并支持占位符的替换。在属性文件中,可以使用 ${} 包裹表达式来引用 SpEL 表达式。例如:

java"><property name="name" value="${app.name}" />

或者

java">package com.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {@Value("${jdbc.url}")String url;@Value("${jdbc.user}")String username;@Value("${jdbc.pwd}")String password;@Value("${jdbc.driver}")String driverClassName;public void print(){System.out.println("url = " + url);System.out.println("username = " + username);System.out.println("password = " + password);System.out.println("driverClassName = " + driverClassName);}}

@annotation

在 Spring 注解中,可以使用 @ 符号引用 SpEL 表达式。例如,在 @Scheduled 注解中使用 SpEL 表达式来指定调度的时间:

java">@Scheduled(cron = "#{systemProperties['scheduler.cron.expression']}")

SpelExpressionParser

通过使用 SpelExpressionParser 类,可以在 Java 代码中直接解析 SpEL 表达式。例如:

java">@RestController
public class demo {@RequestMapping("/demo1")public Object demo(String poc){System.out.println(poc);// 创建 SpEL 表达式解析器ExpressionParser parser = new SpelExpressionParser();// 解析 SpEL 表达式,将字符串 poc 解析为一个可执行的 SpEL 表达式对象Expression exp = parser.parseExpression(poc);// 使用表达式对象获取表达式的值return  exp.getValue();}
}

当我们传入?poc=1+1时,并不能解析,应该是url编码的问题,首先将1+1进行url编码一下,就是?poc=1%2B1此时界面会返回2

如何利用SpEL来执行命令?

这个表达式解析和其他语言的eval函数有点类型,但是不一样,并不是直接传入poc=Runtime.getRuntime().exec("whoami")就可以执行命令了,还需要进行其他处理。

类类型表达式
通过类类型表达式,可以访问类静态方法以及字段,主要是通过T()操作符

我们可以通过T操作符获取某一个类的静态方法,然后再通过表达式解析,具体使用格式:T(类的权限命名).方法名(参数值)
比如

java">T(java.lang.Runtime).getRuntime.exec("calc")
类类型表达式的局限性

T操作符只能调用静态公共方法,并不是所有的方法都能调用。

SpelExpressionParser的局限性

在SpelExpressionParser的局限性存在SimpleEvaluationContextStandardEvaluationContext两种上下文环境,这两种上下文环境中对命令执行有着比较重要的影响

  • SimpleEvaluationContext 不支持类类型表达式,不能进行命令执行
  • StandardEvaluationContext 支持类型型表达式,可以进行命令执行
    默认情况下,在不指定上下文环境下,默认为StandardEvaluationContext

相关笔记代码已上传至Git仓库:JavaCodeAudit


http://www.ppmy.cn/devtools/42458.html

相关文章

k8s遇到的错误记录

时隔四年有开始重新鼓捣k8s了&#xff0c;重新安装后遇到的错误记录如下&#xff1a; Error: Package: kubelet-1.14.0-0.x86_64 (kubernetes) Requires: kubernetes-cni 0.7.5 Available: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) …

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.1 CTPN&#xff08;2016&#xff09; 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network&#xff08;基于连接文本提议网络的自然图像文本…

pdfbox pdf转换图片时中文丢失,变成方框,提示No glyph for xxx in font STSong-Light

使用pdfbox转换图片时&#xff0c;转换出来的图片中文丢失&#xff0c;变成方框。原因是由于服务器字体缺失&#xff0c;pdfbox在转换时找不到合适的字体。 有几种方案&#xff1a; 服务器安装字体&#xff0c;具体资源百度使用备用字体。 将pdfbox中的FontMapperImpl类&…

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中&#xff0c;我们可以看到微服务列表&#xff0c;其中有一栏叫“健康实例数” &#xff08;如下图&#xff09;&#xff0c;表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 &#xff1f; 本章…

Java通用三级菜单工具类

Java通用三级菜单工具类 通常在写三级菜单时会使用递归方式去写&#xff0c;但是时间长了会发现很多重复的代码一直在写&#xff0c;改&#xff0c;也就改几个名字。 实现方式 抽象属性结构 常用的三个字段&#xff0c;子级id、父级id、其次是数组children。 将返回对象或…

Linux 进程

文章目录 冯诺依曼体系 操作系统为什么要有操作系统系统调用和库函数概念进程的组成如何理解进程动态运行系统调用接口和用户操作接口 进程PCBPIDPCB和PIDgetpid()getppid()获取父进程pidfork() 创建进程父子进程为什么要创建子进程/proc 目录内查看进程文件夹chdir()改变进程的…

【文末附gpt升级方案】AIGC(人工智能):技术革命与人类未来的深度解析

AIGC&#xff08;人工智能&#xff09;&#xff1a;技术革命与人类未来的深度解析 摘要&#xff1a;随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已成为现代社会的重要支柱。其中&#xff0c;AIGC&#xff08;Artificial Intelligence Generated Conten…

STM32中SPI的使用

SPI&#xff08;Serial Peripheral Interface&#xff09;是一种高速、全双工、同步的通信协议&#xff0c;它广泛应用于微控制器与外设或其他微控制器之间的通信。SPI通过至少四条线路进行通信&#xff1a;一条串行时钟&#xff08;SCLK&#xff09;、一条主设备输出/从设备输…