老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的東勝網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

Spring全家桶簡(jiǎn)介

Spring發(fā)展到現(xiàn)在,全家桶所包含的內(nèi)容非常龐大,這里主要介紹其中關(guān)鍵的5個(gè)部分,分別是spring framework、 springboot、 spring cloud、spring security、spring mvc。其中的spring framework就是大家常常提到的spring, 這是所有spring內(nèi)容最基本的底層架構(gòu),其包含spring mvc、springboot、spring core、IOC和AOP等等。Spring mvc就是spring中的一個(gè)MVC框架,主要用來(lái)開(kāi)發(fā)web應(yīng)用和網(wǎng)絡(luò)接口,但是其使用之前需要配置大量的xml文件,比較繁瑣,所以出現(xiàn)springboot,其內(nèi)置tomcat并且內(nèi)置默認(rèn)的XML配置信息,從而方便了用戶的使用。下圖就直觀表現(xiàn)了他們之間的關(guān)系。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析而spring security主要是用來(lái)做鑒權(quán),保證安全性的。Spring Cloud基于Spring Boot,簡(jiǎn)化了分布式系統(tǒng)的開(kāi)發(fā),集成了服務(wù)發(fā)現(xiàn)、配置管理、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等各種服務(wù)治理能力。

整個(gè)spring家族有四個(gè)重要的基本概念,分別是IOC、Context、Bean和AOP。 其中IOC指控制反轉(zhuǎn),在spring中的體現(xiàn)就是將對(duì)象屬性的創(chuàng)建權(quán)限回收,然后統(tǒng)一配置,實(shí)現(xiàn)解耦合,便于代碼的維護(hù)。在實(shí)際使用過(guò)程中可以通過(guò)autowired注解,不是直接指定某個(gè)類(lèi),將對(duì)象的真實(shí)類(lèi)型放置在XML文件中的bean中聲明,具體例子如下:



public class WelcomeController {  

    @Autowired  

    private WelcomeService service;  

    @RequestMapping("/welcome")  

    public String welcome() {  

        return service.retrieveWelcomeMessage();  

    }  

}

Spring將所有創(chuàng)建或者管理的對(duì)象稱(chēng)為bean,并放在context上下文中統(tǒng)一管理。至于AOP就是對(duì)各個(gè)MVC架構(gòu)的銜接層做統(tǒng)一處理,增強(qiáng)了代碼的魯棒性。下面這張圖就形象描述了上述基本概念。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

各子組件介紹

Spring發(fā)展至今,整個(gè)體系不斷壯大,子分類(lèi)非常龐大,這里只對(duì)本次涉及的一些組件做簡(jiǎn)單的介紹。

首先是Spring Websocket,Spring內(nèi)置簡(jiǎn)單消息代理。這個(gè)代理處理來(lái)自客戶端的訂閱請(qǐng)求,將它們存儲(chǔ)在內(nèi)存中,并將消息廣播到具有匹配目標(biāo)的連接客戶端。Spring Data是一個(gè)用于簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn),并支持云服務(wù)的開(kāi)源框架,其主要目標(biāo)是使數(shù)據(jù)庫(kù)的訪問(wèn)變得方便快捷。Spring Data Commons是Spring Data下所有子項(xiàng)目共享的基礎(chǔ)框架,Spring Data家族中的所有實(shí)現(xiàn)都是基于Spring Data Commons。簡(jiǎn)單點(diǎn)說(shuō),Spring Data REST把我們需要編寫(xiě)的大量REST模版接口做了自動(dòng)化實(shí)現(xiàn),并符合HAL的規(guī)范。Spring Web Flow是Spring MVC的擴(kuò)展,它支持開(kāi)發(fā)基于流程的應(yīng)用程序,可以將流程的定義和實(shí)現(xiàn)流程行為的類(lèi)和視圖分離開(kāi)來(lái)。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

使用量及使用分布

根據(jù)全網(wǎng)數(shù)據(jù)統(tǒng)計(jì),使用Spring的網(wǎng)站多達(dá)80萬(wàn)余,其中大部分集中在美國(guó),中國(guó)的使用量排在第二位。其中香港、北京、上海、廣東四省市使用量最高。通過(guò)網(wǎng)絡(luò)空間搜索引擎的數(shù)據(jù)統(tǒng)計(jì)和柱狀圖表,如下圖所示。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

漏洞背景介紹(SpEL使用)

0x10 SpEL是什么

SpEL是基于spring的一個(gè)表達(dá)式語(yǔ)言,類(lèi)似于struts的OGNL,能夠在運(yùn)行時(shí)動(dòng)態(tài)執(zhí)行一些運(yùn)算甚至一些指令,類(lèi)似于Java的反射功能。就使用方法上來(lái)看,一共分為三類(lèi),分別是直接在注解中使用,在XML文件中使用和直接在代碼塊中使用。

0x20 SpEL能做什么

● 基本表達(dá)式

包括邏輯運(yùn)算,三目運(yùn)算和正則表達(dá)式等等。

● 類(lèi)操作表達(dá)式

對(duì)象方法調(diào)用,對(duì)象屬性引用,自定義函數(shù)和類(lèi)實(shí)例化等等。

● 集(平臺(tái)不讓發(fā)jihe)合操作表達(dá)式

字典的訪問(wèn),投影和修改等等。

● 其他表達(dá)式

模板表達(dá)式

0x30 SpEL demo

0x31 基于注解的SpEL

可以結(jié)合sping的@Value注解來(lái)使用,可以直接初始化Bean的屬性值

@RestController

class Sangfor {

    @Value(value = "${'aaa'.toUpperCase()}")

    private String test;

    public String getTest(){return test;}

    public void setTest(String value){this.test = value;}

}

在這種情況下可以直接將test的值初始化為AAA

此外,還有很多其他注解的使用方式,可以結(jié)合上面提到的表達(dá)式的四種使用模式。

0x32 基于XML的SpEL

可以直接在XML文件中使用SpEL表達(dá)式如下:

public class SpEL {

    public static void main(String[] args){

        ApplicationContext ctx = new ClassPathXmlApplicationContext("test.xml");

        String hello = ctx.getBean("hello", String.class);

        System.out.println(hello);

    }

}

上面的代碼將會(huì)輸出Hello World!,可以看到遞歸往下找到world的值,最終成功返回。

0x33 字符串操作

import org.springframework.expression.Expression;

import org.springframework.expression.ExpressionParser;

import org.springframework.expression.spel.standard.SpelExpressionParser;



public class SpEL {

    public static void main(String[] args){

        ExpressionParser parser = new SpelExpressionParser();

        // Expression exp = parser.parseExpression("'Hello '.concat('World')");

        Expression exp = parser.parseExpression("'Hello ' + 'World'");

        String message = (String) exp.getValue();

        System.out.println(message);

    }

}

注:類(lèi)似的字符串操作比如toUpperCase(),substr()等等

0x34 類(lèi)相關(guān)操作

使用T(class)來(lái)表示類(lèi)的實(shí)例,除了java.lang的包,剩下的包需要指明。此外還可以訪問(wèn)類(lèi)的靜態(tài)方法和靜態(tài)字段,甚至實(shí)例化類(lèi)。

public class SpEL {

    public static void main(String[] args){

        ExpressionParser parser = new SpelExpressionParser();

        Expression exp = parser.parseExpression("T(Runtime).getRuntime().exec('calc.exe')");

        Object message = exp.getValue();

        System.out.println(message);

    }

}

如上述操作,最終就可以執(zhí)行命令,彈出計(jì)算器。這也是后面SpEL RCE漏洞的利用形式。

0x35 集(平臺(tái)不讓發(fā)jihe)合相關(guān)操作

public class SpEL {

    public static void main(String[] args){

        ExpressionParser parser = new SpelExpressionParser();

        Expression exp = parser.parseExpression("{'sangfor', 'busyer', 'test'}");

        List message = (List) exp.getValue();

        System.out.println(message.get(1));  //busyer

    }

}

通過(guò)上面的操作,可以將字符串轉(zhuǎn)化成數(shù)組,最終可以輸出busyer。

SpEL原理

首先來(lái)了解幾個(gè)概念:

● 表達(dá)式

可以認(rèn)為就是傳入的字符串內(nèi)容

● 解析器

將字符串解析為表達(dá)式內(nèi)容

● 上下文

表達(dá)式對(duì)象執(zhí)行的環(huán)境

● 根對(duì)象和活動(dòng)上下文對(duì)象

根對(duì)象是默認(rèn)的活動(dòng)上下文對(duì)象,活動(dòng)上下文對(duì)象表示了當(dāng)前表達(dá)式操作的對(duì)象

具體的流程如下,其實(shí)就是編譯原理里面的詞法分析和句法分析:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

(1)首先給定表達(dá)式1+2

(2)然后給定SpelExpressionParser解析器,該解析器就實(shí)現(xiàn)了上圖中的分析

(3)定義上下文對(duì)象,這個(gè)是可選的,默認(rèn)是StandardEvaluationContext

(4)使用表達(dá)式對(duì)象求值,例如getValue

具體代碼如下:

ExpressionParser parser = new SpelExpressionParser();

Expression exp = parser.parseExpression("{'sangfor', 'busyer', 'test'}");

//StandardEvaluationContext context = new StandardEvaluationContext();

String message = (String)exp.getValue(context, String.class);

root和this

SpEL中#root總是指的剛開(kāi)始的表達(dá)式對(duì)象,而#this總是指的當(dāng)前的表達(dá)式對(duì)象,用他們可以直接操作當(dāng)前上下文。

SimpleEvaluationContext和StandardEvaluationContext

SimpleEvaluationContext: 不包含類(lèi)相關(guān)的危險(xiǎn)操作,比較安全

StandardEvaluationContext: 包含所有功能,存在風(fēng)險(xiǎn)

高危漏洞介紹

通過(guò)對(duì)Spring漏洞的收集和整理,過(guò)濾出其中影響較大的遠(yuǎn)程代碼執(zhí)行高危漏洞,可以得出如下列表:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析從上表可以看出,這些漏洞分布在Spring不同的子分類(lèi)之間,且大多都是較低的版本,用戶只要及時(shí)升級(jí)高版本并及時(shí)關(guān)注新的漏洞信息即可輕松規(guī)避這些漏洞。盡管近期沒(méi)有出現(xiàn)相關(guān)漏洞,但是這些高風(fēng)險(xiǎn)漏洞依然不可忽視。這里面出現(xiàn)的漏洞大多不需要復(fù)雜的配置就可以直接攻擊成功,從而執(zhí)行任意代碼,危害較大。所以,開(kāi)發(fā)者在使用Spring進(jìn)行開(kāi)發(fā)的過(guò)程中,一定要關(guān)注其歷史風(fēng)險(xiǎn)點(diǎn),盡量規(guī)避高危漏洞,減少修改不必要的配置信息。

漏洞利用鏈

上述漏洞基本不依賴(lài)其他Spring漏洞即可直接獲取權(quán)限,下圖對(duì)其利用方式做了簡(jiǎn)要概述:

高可利用漏洞分析

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

1 CVE-2018-1270

1.1 威脅等級(jí)

嚴(yán)重

1.2 影響范圍

Spring Framework 5.0 - 5.0.5

Spring Framework 4.3 - 4.3.15

1.3 利用難度

簡(jiǎn)單

1.4 漏洞描述

在上面描述的存在漏洞的Spring Framework版本中,允許應(yīng)用程序通過(guò)spring-messaging模塊內(nèi)存中STOMP代理創(chuàng)建WebSocket。攻擊者可以向代理發(fā)送消息,從而導(dǎo)致遠(yuǎn)程執(zhí)行代碼攻擊。

1.5 漏洞分析

點(diǎn)擊connect,首先將觸發(fā)DefaultSubscriptionRegistry.java中的addSubscriptionInternal方法,

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析第80行將首部的selector字段的值取出,就是我們之前傳入的惡意表達(dá)式,接著到83行,這一步就很熟悉了,使用解析器去解析表達(dá)式,顯然這個(gè)時(shí)候再有一個(gè)getValue方法觸發(fā)并且沒(méi)有使用simpleEvaluationContext就能夠直接執(zhí)行我們傳入的表達(dá)式了。

監(jiān)聽(tīng)網(wǎng)絡(luò)流量,發(fā)現(xiàn)后面send信息的時(shí)候,將會(huì)將消息分發(fā)給不同的訂閱者,并且轉(zhuǎn)發(fā)的消息還會(huì)包含之前connect的上下文,即這里的expression將會(huì)包含在內(nèi)。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析于是,嘗試隨便在文本框中輸入一些內(nèi)容,然后點(diǎn)擊Send,最終可以觸發(fā)SimpleBrokerMessageHandler.java中的sendMessageToSubscribers方法如下:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析繼續(xù)進(jìn)入findSubscriptions方法,并且不斷往下走,最終可以發(fā)現(xiàn)在DefaultSubscriptionRegistry.java中filterSubscriptions方法中對(duì)上下文中的expresion做了提取,并使用StandardEvaluationContext指定了上下文,也就是說(shuō)這里面可以直接執(zhí)行代碼,沒(méi)有任何限制。并最終在第164行使用getValue方法觸發(fā)漏洞,彈出計(jì)算器。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析1.6 補(bǔ)丁分析

補(bǔ)丁中直接將上面的StandardEvaluationContext替換成SimpleEvaluationContext,使用該方法能夠避免了惡意類(lèi)的加載。

2 CVE-2018-1273

2.1 威脅等級(jí)

嚴(yán)重

2.2 影響范圍

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)

2.3 利用難度

簡(jiǎn)單

2.4 漏洞描述

Spring Data Commons組件中存在遠(yuǎn)程代碼執(zhí)行漏洞,攻擊者可構(gòu)造包含有惡意代碼的SPEL表達(dá)式實(shí)現(xiàn)遠(yuǎn)程代碼攻擊,直接獲取服務(wù)器控制權(quán)限。

2.5 漏洞分析

從上述/users入口,最終會(huì)調(diào)用到MapPropertyAccessor靜態(tài)類(lèi)中對(duì)用戶名進(jìn)行處理。而在該類(lèi)中包含了進(jìn)行SpEL注入需要滿足的條件如下:

● 首先創(chuàng)建解析器:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析● 接著使用Standard上下文

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析● 然后包含待解析表達(dá)式

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析● 最后使用setValue觸發(fā)

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

2.6 補(bǔ)丁分析

補(bǔ)丁依舊直接將上面的StandardEvaluationContext替換成SimpleEvaluationContext,使用該方法能夠避免了惡意類(lèi)的加載。

3 CNVD-2016-04742

3.1 威脅等級(jí)

嚴(yán)重

3.2 影響范圍

Springboot 1.1.0-1.1.12

Springboot 1.2.0-1.2.7

Springboot 1.3.0

3.3 利用難度

簡(jiǎn)單

3.4 漏洞描述

低版本的springboot在處理內(nèi)部500錯(cuò)誤時(shí),使用了spel表達(dá)式,并且遞歸向下解析嵌套的,其中message參數(shù)是從外部傳過(guò)來(lái)的,用戶就可以構(gòu)造一個(gè)spel表達(dá)式,達(dá)到遠(yuǎn)程代碼執(zhí)行的效果。

3.5 漏洞分析

訪問(wèn)上面的URL,可以進(jìn)入到我們的控制器,并緊接著拋出異常如下:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析進(jìn)入異常的代碼,經(jīng)過(guò)冗長(zhǎng)的代碼調(diào)試,最終可以來(lái)到關(guān)鍵點(diǎn)的render方法:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析接著進(jìn)入render方法查看,這里面的replacePlaceholders方法將會(huì)進(jìn)行形如${}的spel表達(dá)式替換:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析進(jìn)入該方法查看,最后進(jìn)入parseStringValue方法,該方法會(huì)循環(huán)將帶有${}的錯(cuò)誤頁(yè)面的HTML字符串中的一個(gè)個(gè)${}的內(nèi)容進(jìn)行替換,并且這里面的${message}是我們傳入的值。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析于是可以就此構(gòu)造我們的payload,借助他的循環(huán),繼續(xù)解析spel,最終造成任意代碼執(zhí)行。其中,解析spel的代碼如下:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析3.6 補(bǔ)丁分析

通過(guò)添加一個(gè)NonRecursivePropertyPlaceholderHelper類(lèi),對(duì)于二次解析的值進(jìn)行限制:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析4 CVE-2017-8046

4.1 威脅等級(jí)

嚴(yán)重

4.2 影響范圍

Spring Data REST prior to 3.0.1 and Spring Boot versions prior to 1.5.9

Spring Data REST prior to 2.6.9 Spring Boot versions prior to 1.5.9

4.3 利用難度

簡(jiǎn)單

4.4 漏洞描述

用戶在使用PATCH方法局部更新某個(gè)值的時(shí)候,其中的path參數(shù)會(huì)被傳入SpEL表達(dá)式,進(jìn)而導(dǎo)致代碼執(zhí)行。

4.5 漏洞分析

執(zhí)行上述payload,定位到程序的入口如下:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

(注:這個(gè)類(lèi)在springmvc里面,名字為JsonPatchHandler)

重點(diǎn)看這個(gè)三目運(yùn)算,其中的判斷是看HTTP方法是否為PATCH和content-type是否為我們上面提到的那個(gè),然后會(huì)進(jìn)入this.applyPatch方法,接著根據(jù)我們指定的replace字段進(jìn)入對(duì)應(yīng)的處理器:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

然后實(shí)例化patchOperation,并初始化spel解析器:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

最后再調(diào)用setValue觸發(fā):

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

4.6 補(bǔ)丁分析

這里用2.6.9中的修復(fù)方案舉例子,在perform中不是直接setvalue,而是先做一個(gè)參數(shù)合法性校驗(yàn)(此處添加了SpelPath類(lèi)),將path中的參數(shù)用'.'分割,然后依次判斷是否是類(lèi)的屬性,只要有一個(gè)不是就直接報(bào)錯(cuò),從而解決了上述問(wèn)題,部分補(bǔ)丁圖片如下:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析

5 CVE-2017-4971

5.1 威脅等級(jí)

中危

5.2 影響范圍

Spring Web Flow 2.4.0 ~ 2.4.4

Spring Web Flow 2.4.4 ~ 2.4.8

5.3 利用難度

較高

5.4 漏洞描述

當(dāng)用戶使用Spring Web Flow受影響的版本時(shí),如果配置了view-state,但是沒(méi)有配置相應(yīng)的binder,并且沒(méi)有更改useSpringBeanBinding默認(rèn)的false值,當(dāng)攻擊者構(gòu)造特殊的http請(qǐng)求時(shí),就可以導(dǎo)致SpEL表達(dá)式注入,從而造成遠(yuǎn)程代碼執(zhí)行漏洞。

5.5 漏洞分析

首先通過(guò)執(zhí)行confirm請(qǐng)求,斷點(diǎn)到如下位置:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析這里可以發(fā)現(xiàn)可以通過(guò)判斷binderConfiguration是否為空來(lái)選擇進(jìn)入哪個(gè)處理方法,這里的binderConfiguration值指的是在配置文件中配置的binder內(nèi)容。深入查看這兩個(gè)處理方法。其實(shí)都用了SpEL表達(dá)式,不過(guò)addModelBindings方法傳入的參數(shù)的是上面提到的binder,是寫(xiě)死在xml文件中的,無(wú)法去更改,所以這里面就考慮當(dāng)沒(méi)配置binder的情況下走進(jìn)addDefaultMapping方法的情況。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析addDefaultMappings方法如上,其作用是遍歷所有的參數(shù),包括GET參數(shù)和POST中的參數(shù),然后一個(gè)個(gè)判斷其是否以"_"開(kāi)頭,如果符合就進(jìn)入addEmptyValueMapping方法進(jìn)行處理,否則就進(jìn)入addDefaultMapping方法進(jìn)行處理。本次漏洞的觸發(fā)點(diǎn)是上面這一個(gè),所以我們深入查看一下addEmptyValueMapping方法。

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析可以看到該方法用SpEL表達(dá)式解析了傳入的變量名,并在后面使用了get操作,從而可以導(dǎo)致漏洞的產(chǎn)生。

5.6 補(bǔ)丁分析

查看官方補(bǔ)丁源碼如下:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析將表達(dá)式類(lèi)型換成了BeanWrapperExpressionParser,因?yàn)樵擃?lèi)型內(nèi)部實(shí)現(xiàn)不能夠處理類(lèi)所以避免了該問(wèn)題的發(fā)生。

然而上述還提到如果參數(shù)類(lèi)型不是以"_"開(kāi)頭的將會(huì)進(jìn)入addDefaultMapping方法,下面我們進(jìn)入該方法進(jìn)行查看:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析可以看到這里也對(duì)傳入的參數(shù)進(jìn)行了解析但是沒(méi)有看到明顯的get方法來(lái)觸發(fā),繼續(xù)往下尋找get方法。首先這里面將解析器放入了mapper中,下面就重點(diǎn)追蹤這個(gè)mapper的使用即可。

首先發(fā)現(xiàn)一步步回到之前的bind方法,可以發(fā)現(xiàn)最后一行對(duì)該mapper進(jìn)行了操作,跟進(jìn)該map方法:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析在這里就進(jìn)行了get操作,從而再次觸發(fā)了漏洞。

對(duì)此,也可能跟這個(gè)沒(méi)關(guān)系,官方最終將全局的解析器換成SimpleEvaluationContext來(lái)徹底解決此問(wèn)題。

6 CNVD-2019-11630

6.1 威脅等級(jí)

嚴(yán)重

6.2 影響范圍

Spring Boot 1-1.4

Spring Boot 2.x

6.3 利用難度

簡(jiǎn)單

6.4 漏洞描述

用戶在通過(guò)env路徑修改spring.cloud.bootstrap.location的位置,將該地址設(shè)置為一個(gè)惡意地址時(shí),并在后面使用refresh接口進(jìn)行觸發(fā)就可以導(dǎo)致靶機(jī)加載惡意地址中的文件,遠(yuǎn)程執(zhí)行任意代碼。

6.5 漏洞分析

搭建環(huán)境并按上述方式進(jìn)行攻擊,并搜索到spring-cloud-context-1.2.0.RELEASE.jar中的environment和refresh,然后下斷點(diǎn)跟進(jìn),可以發(fā)現(xiàn)首先的env改變會(huì)將下面體現(xiàn):

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析其實(shí)就是將環(huán)境中該變量的屬性值進(jìn)行更新。

之后看一下關(guān)鍵點(diǎn)refresh接口,首先一旦refresh接口被觸發(fā),就會(huì)將有變化的信息以及一些基本信息挑選出來(lái),如下圖可以看到之前變化的值已經(jīng)被挑選出來(lái):

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析接著進(jìn)入到addConfigFilesToEnvironment方法進(jìn)行處理,先獲取到所有的環(huán)境值,然后設(shè)置一個(gè)監(jiān)聽(tīng)器,依次處理變化的信息:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析這里我們直接跳轉(zhuǎn)到處理這個(gè)惡意地址的關(guān)鍵部分,首先進(jìn)入ConfigFileApplicationListener的load方法:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析這里面先判斷url是否存在文件路徑,如果存在才進(jìn)入處理該地址,否則將name的參數(shù)設(shè)置成searchName進(jìn)行處理,這里的值為“bootstrap”,后面會(huì)強(qiáng)行加上后綴。然后一直深入到PropertySourcesLoader類(lèi)中的load方法:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析首先會(huì)發(fā)送一個(gè)head請(qǐng)求判斷文件是否存在,以及是否是一個(gè)文件,然后會(huì)根據(jù)文件后綴來(lái)判斷是否能解析,這里面就是yml文件,所以判斷可以用YamlPropertySourceLoader類(lèi)來(lái)處理。然后進(jìn)入該類(lèi)的load方法中:

如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析在這里將會(huì)加載遠(yuǎn)程yml文件,并處理里面的內(nèi)容,而導(dǎo)致遠(yuǎn)程代碼執(zhí)行的發(fā)生。

6.6 補(bǔ)丁分析

在springboot 1.5及以后,官方對(duì)這些接口添加了授權(quán)驗(yàn)證,不能夠再肆意的調(diào)用他們了。

看完上述內(nèi)容,你們掌握如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前題目:如何進(jìn)行Spring全家桶中各類(lèi)RCE漏洞淺析
路徑分享:http://www.xueling.net.cn/article/iejdhj.html

其他資訊

在線咨詢(xún)
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 国产精品福利区一区二区三区四区 | 欧美变态另类刺激 | 97超碰国产精品无码分类 | 欧洲精品视频一区二区 | 日韩精品欧美激情 | 热逼视频| 国产亲子乱弄免费视频 | 亚洲第一黄色网址 | 亚洲熟妇无码AV另类VR影视 | 色国产综合视频 | 琪琪午夜成人理论福利片美容院 | 亚洲狠狠色综合蜜桃 | 91精品啪啪| 欧洲一区二区三区精品 | 日日射av | 日韩精品一区二区三区不卡 | 在线观看av你懂的 | 国产精品不卡视频 | 一级小视频 | 91tv影院 | 911影院在线观看网站 | 欧美xxxxx自由摘花 | 日韩视频在线观看一区二区 | 娇喘抽搐高潮喷水A片免费观看 | 9传媒制片厂制作在线观看 极品美女a诱v惑在线观看免费 | 欧美日韩在线视频免费 | 成人国产精品2021 | 99最新在线视频 | 天堂在线99香蕉在线视频 | 2021久久超碰国产精品最新 | 国产激情久久久久影院老熟女免费 | 日本中文在线一区 | 黑人40厘米全部进去A片 | 亚洲成人字幕 | 精品国产a∨无码一区二区三区 | 国内精品小视频 | www.日本国产| 天天躁夜夜躁狠狠躁婷婷 | 琪琪五月天| 柠檬导航精品导航 | 四虎中文 |