作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/8zzXZgSwHAmte5t7KSDhdA

漏洞描述

6月20號,VMware發布安全公告,修復了spring Data MongoDB 組件中的一個SpEL表達式注入漏洞,該漏洞的CVSSv3評分為8.2,漏洞編號:CVE-2022-22980,漏洞威脅等級:高危。

Spring Data MongoDB應用程序在對包含查詢參數占位符的SpEL表達式使用@Query或@Aggregation注解的查詢方法進行值綁定時,若輸入未被過濾,則易遭受SpEL注入攻擊。該漏洞允許未經身份驗證的攻擊者構造惡意數據執行遠程代碼,最終獲取服務器權限。

相關介紹

Spring Data for MongoDB是 Spring Data 項目的一部分,該項目旨在為新的數據存儲提供熟悉和一致的基于Spring的編程模型,同時保留存儲的特定特征和功能。Spring 表達式語言(簡稱SpEL):是一個支持運行時查詢和操作對象圖的強大的表達式語言,也是一種簡潔的裝配Bean的方式,它通過運行期執行的表達式將值裝配到Bean的屬性或構造器參數中。

通過 SpEL 可以實現:通過 bean 的 id 對 bean 進行引用;調用方式以及引用對象中的屬性;計算表達式的值;正則表達式的匹配。

利用范圍

Spring Data MongoDB == 3.4.0

3.3.0 <= Spring Data MongoDB <= 3.3.4

更早或不再受支持的Spring Data MongoDB版本也受到此漏洞影響。

漏洞分析

環境搭建

此次采用threedr3am師傅的漏洞demo(https://github.com/threedr3am/learnjavabug/tree/master/spring/spring-data-mongodb-spel-CVE-2022-22980)進行復現分析。

動態調式

在調試之前查看一下demo中的DemoController,其構造的請求路徑為/demo,請求參數為keyword。

根據diff(https://github.com/spring-projects/spring-data-mongodb/commit/7c5ac764b343d45e5d0abbaba4e82395b471b4c4?diff=split)記錄發現,此次漏洞修復的主要位置在ParameterBindingJsonReader 類的 bindableValueFor 函數。

話不多說,先在org.springframework.data.mongodb.util.json.ParameterBindingJsonReader#bindableValueFor函數處打下斷點。

將環境運行起來后開啟debug模式。使用burp抓包并傳入payload后,立即觸發斷點。

持續跟進,當第一次到達漏洞觸發點時,發現并未成功觸發payload。

繼續跟進,發現在org.springframework.data.mongodb.util.json.ParameterBindingJsonReader#readBsonType函數中判斷token的Type屬性后,進入到UNQUOTED_STRING,在這里進行setCurrentName操作,value為id。

隨后回到bindableValueFor函數,后續經過對value的處理,value由id變為了:#{?0}。

在value為:#{?0}后,會再次進入org.springframework.data.mongodb.util.json.ParameterBindingJsonReader#bindableValueFor函數。

在bindableValueFor函數中首先對tokenValue進行了賦值,隨后對tokenValue進行PARAMETER_BINDING_PATTERN和EXPRESSION_BINDING_PATTERN規則匹配。

EXPRESSION_BINDING_PATTERN只能匹配 ?#{} 或者:#{}形式的字符串。

隨后,將賦值交給binding,再通過substring取出占位符?0

接下來通過for循環將占位符和傳入的payload進行替換。

同時通過PARAMETER_BINDING_PATTERN規則匹配成功后即認為是spel表達式格式,此時expression為傳入payload。

執行this.evaluateExpression。

最終進入org.springframework.data.mongodb.repository.query.DefaultSpELExpressionEvaluator#evaluate函數,此時使用的是 StandardEvaluationContext 類型,包含了 SpEL 所有的功能。

此時的 SpEL表達式為之前構造的惡意攻擊載荷,可成功命令執行。

漏洞復現

修復建議

目前此漏洞已經修復,受影響的用戶建議盡快升級至官方修護版本:

Spring Data MongoDB 3.4.1或更高版本;

Spring Data MongoDB 3.3.5或更高版本。

下載鏈接:

https://github.com/spring-projects/spring-data-mongodb/tags

參考材料

1.https://tanzu.vmware.com/security/cve-2022-22980

2.https://xz.aliyun.com/t/11478

3.https://spring.io/blog/2022/06/20/spring-data-mongodb-spel-expression-injection-vulnerability-cve-2022-22980


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/2004/