【web安全】Spring Data Commons 1.13.10 SpEL漏洞分析
一、簡介
Spring Data是一個用于簡化數(shù)據(jù)庫訪問,并支持云服務(wù)的開源框架,Spring Data Commons是Spring Data下所有子項目共享的基礎(chǔ)框架。Spring Data Commons 在2.0.5及以前版本中,存在一處SpEL表達(dá)式注入漏洞,攻擊者可注入惡意SpEL表達(dá)式以執(zhí)行任意命令,漏洞編號為CVE-2018-1273。
? 該漏洞發(fā)生在屬性自動綁定階段,當(dāng)用戶在項目中利用了Spring Data的相關(guān)Web特性對用戶的輸入?yún)?shù)進(jìn)行自動匹配的時候,會將用戶提交的Form表單的key值作為SpEL的執(zhí)行內(nèi)容,利用該特性,發(fā)送Payload將可能導(dǎo)致遠(yuǎn)程代碼執(zhí)行。
二、影響版本
- Spring Data Commons 1.13 to 1.13.10 (Ingalls SR10)
- Spring Data REST 2.6 to 2.6.10 (Ingalls SR10)
- Spring Data Commons 2.0 to 2.0.5 (Kay SR5)
- Spring Data REST 3.0 to 3.0.5 (Kay SR5)
- Older unsupported versions are also affected
三、環(huán)境搭建
所使用Spring Data Commons 測試版本為1.13.10
搭建效果如下圖:
四、漏洞復(fù)現(xiàn)
【→所有資源關(guān)注我,私信回復(fù)“資料”獲取←】
1、網(wǎng)絡(luò)安全學(xué)習(xí)路線
2、電子書籍(白帽子)
3、安全大廠內(nèi)部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經(jīng)典題目解析
7、全套工具包
8、應(yīng)急響應(yīng)筆記
example:name[T(java.lang.Runtime).getRuntime().exec(“calc”)]
漏洞復(fù)現(xiàn)效果,如下圖所示:
五、漏洞原理
? 尋找漏洞代碼段,定位到spring-data-commons-1.13.10.RELEASE.jar!org.springframework.data.web.ProxyingHandlerMethodArgumentResolver.class#createAttribute(),程序錯誤將用戶輸入傳遞至MapDataBinder.bind方法。
惡意數(shù)據(jù)帶入,效果如下圖所示:
當(dāng)用戶使用[]嵌套屬性語法,程序?qū)]中SPEL表達(dá)式解析并得到屬性(特性),于是攻擊者可注入惡意SpEL表達(dá)式以執(zhí)行任意命令。
? 特性:通過一定的規(guī)則對及格進(jìn)行篩選,構(gòu)造出另一個集合 語法:“(list|map).? [選擇表達(dá)式]” 選擇表達(dá)式結(jié)果必須是boolean類型,如果true則選擇的元素將添加到新集合中,false將不添加到新集合中。
解析SPEL表達(dá)式,效果如下圖所示:
六、POC構(gòu)造
? 在實戰(zhàn)中需要Fuzz字段,找尋自動屬性字段。實驗中Controller代碼Account.name 已使用Spring默認(rèn)構(gòu)造器屬性String getName()。故選取name為注入?yún)?shù)。
使用[]嵌套屬性語法,程序?qū)]中SPEL表達(dá)式解析并得到屬性,故POC 嘗試 name[T(java.util.Arrays).toString(T(java.nio.file.Files).list(T(java.nio.file.Paths).get(‘d:\i4Tools7’)).toArray())]
? 但Response頁面報錯并無回顯點,故此類文件讀取POC無法驗證漏洞存在,無法驗證代碼執(zhí)行成功。
? 嘗試使用DNSLOG 驗證執(zhí)行成功,故POC 調(diào)整為,如burp圖中所示。
驗證DNSLOG出網(wǎng),效果如下圖所示:
七、修復(fù)方法
? 將pom.xml中的org.springframework.boot設(shè)置為1.13.11版本或更新版本。
補(bǔ)丁將StandardEvaluationContext替代為SimpleEvaluationContext。
因SimpleEvaluationContext不包括 Java 類型引用,構(gòu)造函數(shù)和 bean 引用,所以安全性較高。
補(bǔ)丁修復(fù),效果如下圖所示:
八、小結(jié)
? 在審計中,可使用關(guān)鍵字加快進(jìn)展,如org.springframework.expression.spel.standard、 expression.getValue()、expression.setValue() 、StandardEvaluationContext。
? SPEL表達(dá)式較為靈活,其可以很好地適配業(yè)務(wù)中“經(jīng)常變化”的部分,這可以是“業(yè)務(wù)規(guī)則”,也可以是“不同的數(shù)據(jù)處理邏輯”,SpEL的T{}表達(dá)式靈活具備反射的特點,在Spring環(huán)境下無需額外導(dǎo)包較為便捷。常見的SPEL實現(xiàn)資源的注入有如:調(diào)用各種資源的情況,包含普通文件、網(wǎng)址、配置文件、系統(tǒng)環(huán)境變量、使用預(yù)先定義模板的方式獲取或者設(shè)置某對象中指定屬性名的屬性值。
? 在項目中運用Spel技術(shù)的開發(fā)人員編程水平通常較高,也正是這種巧妙運用,使得漏洞較為隱蔽,較難實現(xiàn)一致性修復(fù),需要安全人員付出足夠耐心去尋找查核修復(fù)完成情況。
總結(jié)
以上是生活随笔為你收集整理的【web安全】Spring Data Commons 1.13.10 SpEL漏洞分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【web安全】Spring boot h
- 下一篇: JavaScript与DOM编程