【修復總結(jié)】Spring SpEL表達式代碼注入

威脅描述

計算未驗證的 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及以上

參考:CVE-2018-1273:Spring Expression Language 漏洞分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容