威脅描述
計算未驗證的 SpEL 表達式可能導致執(zhí)行遠程代碼。
威脅說明
Spring 表達式語言(簡寫為 SpEL)是一種功能強大的表達式語言,支持在運行時查詢和處理對象圖。該語言的語法與統(tǒng)一 EL 類似,但提供了更多功能,尤其是方法調(diào)用和基本字符串模板化功能。允許計算未驗證的表達式將允許攻擊者執(zhí)行任意代碼。
示例 1:應(yīng)用程序使用受用戶控制的未驗證數(shù)據(jù)創(chuàng)建和計算 SpEL 表達式
String expression = request.getParameter("message");
SpelExpressionParser parser = new SpelExpressionParser();
SpelExpression expr = parser.parseRaw(expression);
示例 2:應(yīng)用程序在執(zhí)行雙重 SpEL 計算的 Spring 標記中使用受用戶控制的未驗證數(shù)據(jù)
<spring:message text="" code="${param['message']}"></spring:message>
示例1和示例2攻擊Payload:
# 彈出計算器
http://localhost:8080/test?message=${new%20java.lang.ProcessBuilder(new%20java.lang.String(new%20byte[]{99,97,108,99})).start()} # calc
參考
修復建議
1. 限制SpEL功能
SpEL 提供的兩個 EvaluationContext ,區(qū)別如下:
-
SimpleEvaluationContext- 針對不需要 SpEL 語言語法的全部范圍并且應(yīng)該受到有意限制的表達式類別,公開 SpEL 語言特性和配置選項的子集。 -
StandardEvaluationContext- 公開全套 SpEL 語言功能和配置選項。您可以使用它來指定默認的根對象并配置每個可用的評估相關(guān)策略。
SimpleEvaluationContext 旨在僅支持 SpEL 語言語法的一個子集。它不包括 Java類型引用、構(gòu)造函數(shù) 和 bean引用。所以說指定正確 EvaluationContext ,是防止SpEl表達式注入漏洞產(chǎn)生的首選。方法如下:
String expression = request.getParameter("message");
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(expression);
StandardEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().withRootObject().build();
String message = exp.getValue(context, String.class);
exp.setValue(context, "Hello");
參考:Spring表達式使用
2. Spring Boot
影響版本:
-
1.1.0-1.1.12 -
1.2.0-1.2.7 1.3.0
修復方案:升級至 1.3.1 或以上版本
參考:
3. Spring Data Commons
影響版本:
- Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10)
- Spring Data REST 2.6 - 2.6.10 (Ingalls SR10)
- Spring Data Commons 2.0 to 2.0.5 (Kay SR5)
- Spring Data REST 3.0 - 3.0.5 (Kay SR5)
- 更早的版本也會受到影響
修復方法:
升級代碼框架
- Spring Data Commons
- 2.0.x的用戶升級到2.0.6及以上
- 1.13.x的用戶升級到1.13.11及以上
- Spring Data REST
- 2.x用戶升級到2.6.11及以上
- 3.x用戶升級到3.0.6及以上
- Spring Boot
- 1.5.x用戶升級到1.5.11及以上
- 2.x用戶升級到2.0.1及以上