设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

Java代码审计之SpEL表达式注入(3)

发布时间:2019-03-13 17:43 所属栏目:20 来源:Lateink
导读:然后发现了! 在这里调用了 this.subscriptionRegistry.getSubscriptions(sessionId) 并从中取出 info-sub- expression。 最关键的是,这里直接调用了 expression.getValue()!这说明如果能控制 SpEL 的表达式,就能

然后发现了!

在这里调用了 this.subscriptionRegistry.getSubscriptions(sessionId) 并从中取出 info->sub-> expression。

最关键的是,这里直接调用了 expression.getValue()!这说明如果能控制 SpEL 的表达式,就能直接命令执行!

再来看看这个 filterSubscriptions 函数在哪里调用。从函数的调用回溯追踪调用链如下:

  1. filterSubscriptions -> findSubscriptionsInternal -> findSubscriptions -> sendMessageToSubscribers 

2. sendMessageToSubscribers 即发送消息的功能

回顾一下整个流程,SpEL 表达式从 headers 中 selector 获取,即发送请求时添加 selector 到请求的 header 即可传入,然后生成 expression 对象传入 this.subscriptionRegistry,然后当发送消息的时候,最终会直接从 this.subscriptionRegistry 取出并调用 expression.getValue() 执行我们传入的 SpEL 表达式。

验证过程,在 expression.getValue() 这里打个断点,看看发送消息是否会拦截并查看调用链是否如上述分析一样。

Bingo!

简单总结一下 SpEL 表达式注入的分析思路,可以先全局搜索 org.springframework.expression.spel.standard, 或是 expression.getValue()、expression.setValue(),定位到具体漏洞代码,再分析传入的参数能不能利用,最后再追踪参数来源,看看是否可控。Spring Data Commons Remote Code Execution 的 SpEL 注入导致的代码执行同样可以用类似的思路分析。

五、漏洞修复

SimpleEvaluationContext、StandardEvaluationContext 是 SpEL 提供的两个 EvaluationContext:

  • SimpleEvaluationContext - 针对不需要 SpEL 语言语法的全部范围并且应该受到有意限制的表达式类别,公开 Spal 语言特性和配置选项的子集。
  • StandardEvaluationContext - 公开全套 SpEL 语言功能和配置选项。您可以使用它来指定默认的根对象并配置每个可用的评估相关策略。

SimpleEvaluationContext 旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java 类型引用,构造函数和 bean 引用;所以最直接的修复方式是使用 SimpleEvaluationContext 替换 StandardEvaluationContext。

这是我个人学习代码审计过程中的小总结,可能逻辑性相对来说没那么严谨,但是个人觉得这是一个比较通俗易懂的分析方法,不喜勿喷。

【编辑推荐】

  1. WinRAR被曝严重安全漏洞 5亿用户受影响
  2. 警告:WinRAR关键漏洞影响过去19年发布的所有版本
  3. 4G/5G再曝新漏洞 攻击者可拦截电话和追踪用户位置
  4. 5G落地不能急 三个4G/5G新漏洞被曝出
  5. 任意URL跳转漏洞修复与JDK中getHost()方法之间的坑
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读