spring cloud gateway漏洞修改前后代码对比

修改部分:对于3.0.4版本和3.0.7版本主要修改是org.springframework.cloud.gateway.supportShortcutConfigurable类中的

static Object getValue(SpelExpressionParser parser, BeanFactory beanFactory, String entryValue) {
		Object value;
		String rawValue = entryValue;
		if (rawValue != null) {
			rawValue = rawValue.trim();
		}
		if (rawValue != null && rawValue.startsWith("#{") && entryValue.endsWith("}")) {
			// assume it's spel
			GatewayEvaluationContext context = new GatewayEvaluationContext(beanFactory);
			Expression expression = parser.parseExpression(entryValue, new TemplateParserContext());
			value = expression.getValue(context);
		}
		else {
			value = entryValue;
		}
		return value;
	}

此处的GatewayEvaluationContext context = new GatewayEvaluationContext(beanFactory);之前使用的

			StandardEvaluationContext context = new StandardEvaluationContext();
			context.setBeanResolver(new BeanFactoryResolver(beanFactory));

GatewayEvaluationContext 实际上是对SimpleEvaluationContext的一个包装真实动作都是由SimpleEvaluationContext执行的并通过添加一个配置属性来决定是否启用属性的处理

spring.cloud.gateway.restrictive-property-accessor.enabled

默认是true即不允许访问

最后原因在于

StandardEvaluationContext类的TypeLocator使用StandardTypeLocator类,此类处理spel的时候会从java.lang包下搜索需要的类并执行其方法及参数

例子如下代码

package com.example.demo;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.SimpleEvaluationContext;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class HelloTest {
    public static void main(String[] args) {
        
//        EvaluationContext standardEvaluationContext = SimpleEvaluationContext.forReadOnlyDataBinding().build();
        EvaluationContext standardEvaluationContext = new StandardEvaluationContext();
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        Expression expression = spelExpressionParser.parseExpression("#{T(java.lang.Runtime).getRuntime().exec(\"calc\")}", new TemplateParserContext());
        expression.getValue(standardEvaluationContext);

    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半块橘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值