威脅描述
計算未驗證的 SpEL 表達式可能導致執(zhí)行遠程代碼。
威脅說明
Spring 表達式語言(簡寫為 SpEL)是一種功能強大的表達式語言奸远,支持在運行時查詢和處理對象圖。該語言的語法與統(tǒng)一 EL 類似狮斗,但提供了更多功能牧抵,尤其是方法調用和基本字符串模板化功能灭袁。允許計算未驗證的表達式將允許攻擊者執(zhí)行任意代碼实昨。
示例 1:應用程序使用受用戶控制的未驗證數據創(chuàng)建和計算 SpEL 表達式
String expression = request.getParameter("message");
SpelExpressionParser parser = new SpelExpressionParser();
SpelExpression expr = parser.parseRaw(expression);
示例 2:應用程序在執(zhí)行雙重 SpEL 計算的 Spring 標記中使用受用戶控制的未驗證數據
<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 語言語法的全部范圍并且應該受到有意限制的表達式類別应役,公開 SpEL 語言特性和配置選項的子集罗标。 -
StandardEvaluationContext
- 公開全套 SpEL 語言功能和配置選項。您可以使用它來指定默認的根對象并配置每個可用的評估相關策略闰挡。
SimpleEvaluationContext
旨在僅支持 SpEL 語言語法的一個子集。它不包括 Java類型引用
礁哄、構造函數
和 bean引用
。所以說指定正確 EvaluationContext
溪北,是防止SpEl表達式注入漏洞產生的首選桐绒。方法如下:
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及以上