Spring Data MongoDB: 3.3.0-3.3.4、3.4.0
使用@Query或@Aggregation注解进行查询时,通过占位符获取输入参数可能会触发SpEL表达式解析
使用三梦师傅的环境
https://github.com/threedr3am/learnjavabug/tree/master/spring/spring-data-mongodb-spel-CVE-2022-22980
demo里面构造了使用@query注解查询,参数直接通过注解处理,注解构造成以下格式
来到ParameterBindingJsonReader.bindableValueFor()
处理注解,,因为是json形式,if判断通过,然后正则匹配?#{xx}
或:#{xx}
如果匹配成功,再查看占位符的值是不是?\d+
的形式
如果是就进入evaluateExpression触发SpEL解析,这里完成了replace替换成我们输入的参数
最后在默认解析器解析,这里可以完成所有的SpEL功能
也就是说:当注解设置成以下形式时,会被判定为SpEL表达式:只要是json形式、无论键值对包含占位符即可
@Query("{xx: :#{?0} }")
@Query("{#{?0}: xx}")
@Query("{xx: ?#{?0} }")
......
同样的触发点在下面也有,UNQUOTED_STRING是判断注解值是否被引号包裹
那么这样也能触发
@Query("{'xx': ':#{?0}' }")
只要构造恶意注解来进行参数赋值,就能达到SpEL注入
修改了以下文件
首先就是对注解的过滤判断
其次就是替换了SpEL解析器,更安全解析
需要特定格式的注解才能触发SpEL注入
https://tanzu.vmware.com/security/cve-2022-22980
https://github.com/spring-projects/spring-data-mongodb/commit/7c5ac764b343d45e5d0abbaba4e82395b471b4c4#diff-49274f4ac571bc3fa537d508078619cb5cf8e5c7b138db84e46794197499a95c
欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://ho1aas.blog.csdn.net/article/details/126244053
版权声明:本文为原创,转载时须注明出处及本声明