CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞

admin 2022年6月29日00:30:36评论124 views字数 1592阅读5分18秒阅读模式

★且听安全-点关注,不迷路!



CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞

★漏洞空间站-优质漏洞资源和小伙伴聚集地!


漏洞信息


Spring Data MongoDB 是一个开源项目,它提供了与 MongoDB 文档数据库的集成,可以极大提高 Java 开发人员在使用 MongoDB 时的效率。近日监控到 Spring Data MongoDB 爆出 SpEL 表达式注入漏洞 CVE-2022-22980 ,漏洞通告如下:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


当使用 `@Query` 或 `@Aggregation` 注释进行查询并且通过 SpEL 表达式中形如 `?0` 、`?1` 等占位符进行参数赋值时,可导致 SpEL 表达式注入漏洞,从而实现 RCE 。影响版本如下:


  •  v3.4.0

  •  v3.3.0 to v3.3.4

  •  Older, unsupported versions are also affected


补丁对比



首先对 v3.4.0 和 v3.4.1 进行补丁对比分析,发现针对 SpEL 表达式解析的修复主要集中在 `ParameterBindingJsonReader` 类的 `bindableValueFor` 函数:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


从上面对比截图可以看出,如果要触发 SpEL 表达式解析,需要传入的参数 `tokenValue` 满足正则表达式 `EXPRESSION_BINDING_PATTERN`:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


环境搭建


通过查阅 Spring Data MongoDB 相关文档,发现从 v3.1 版本开始支持 SpEL 表达式查询模式:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


为了方便漏洞调试分析,新建一个 SpringBoot 项目,并引入 Spring Data MongoDB v3.4.0 。参考  Spring Data MongoDB 查询 SpEL 解析定义规范以及补丁对比分析结果,完成调试环境配置(完整环境构建过程请参考漏洞空间站)。最后为了方便构造漏洞测试过程,编写如下控制器:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


漏洞分析


回顾补丁对比的结果,我们首先在 `ParameterBindingJsonReader#bindableValueFor` 函数处打下断点,发送如下请求:


GET /user/finduser?username=test HTTP/1.1Host: 127.0.0.1:8080User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateConnection: close


成功触发断点,第一次调用将处理 `username` 参数,后面的调用将处理设置的解析规则:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


继续往下走,通过 `EXPRESSION_BINDING_PATTERN` 正则匹配成功后,将进入 第 312 行:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


第 316 行通过一个循环完成 `?0` 占位符替换:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


此时 `expression` 变量变成了 GET 参数的值`test` ,并被带入 `evaluateExpression` 函数。一直跟进,最终将进入 `DefaultSpELExpressionEvaluator#evaluate` 函数:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


此时使用的是 `StandardEvaluationContext` 类型,包含了 SpEL 所有的功能,并且输入参数完全可控,所以可以实现RCE 。


漏洞复现


替换请求参数为 SpEL 表达式注入漏洞载荷,最终效果如下:


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全及文章作者不为此承担任何责任。



★且听安全-点关注,不迷路!

CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞



★漏洞空间站-优质漏洞资源和小伙伴聚集地!

CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞


原文始发于微信公众号(且听安全):CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月29日00:30:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-22980 Spring Data MongoDB 存在 SpEL 表达式注入漏洞http://cn-sec.com/archives/1136763.html

发表评论

匿名网友 填写信息