最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

網(wǎng)安 | 反序列化POP調(diào)用鏈構(gòu)造一

2023-08-16 14:24 作者:蝸牛學(xué)苑  | 我要投稿

一、什么是POP

POP即:面向?qū)傩跃幊蹋≒roperty-Oriented Programing)常用于上層語言構(gòu)造特定調(diào)用鏈的方法,是從現(xiàn)有運(yùn)行環(huán)境中尋找一系列的代碼或者指令調(diào)用,然后根據(jù)需求構(gòu)成一組連續(xù)的調(diào)用鏈。在控制代碼或者程序的執(zhí)行流程后就能夠使用這一組調(diào)用鏈做一些工作了。

一般的序列化攻擊都在PHP魔術(shù)方法中出現(xiàn)可利用的漏洞,因?yàn)樽詣诱{(diào)用觸發(fā)漏洞,但如果關(guān)鍵代碼沒在魔術(shù)方法中,而是在一個(gè)類的普通方法中。這時(shí)候就可以通過構(gòu)造POP鏈尋找相同的函數(shù)名將類的屬性和敏感函數(shù)的屬性聯(lián)系起來。

二、PHP漏洞代碼

請通過反序列化操作,執(zhí)行任意PHP命令。

三、POP調(diào)用鏈分析

1、確定終點(diǎn)

經(jīng)過詳細(xì)分析,目標(biāo)調(diào)用存在于Tiger類的boss方法中,只要能夠構(gòu)造出boss方法的參數(shù)值為一條序列化字符串的PHP代碼,即可完成。

2、尋找起點(diǎn)

通常反序列化過程中,必然會被自動調(diào)用的是__wakeup 和 __destruct?兩個(gè)魔術(shù)方法,所以尋找上述代碼中的起點(diǎn),發(fā)現(xiàn)只有在Monkey類中存在__wakeup,那么就暫時(shí)先以Monkey類作為起點(diǎn),進(jìn)行反序列化操作,但是是否能達(dá)到終點(diǎn)并不完全確定,如果最終無法到達(dá)終點(diǎn),那么我們就必須要繼續(xù)尋找新的起點(diǎn),或者是評估調(diào)用鏈?zhǔn)欠裾_。

3、確定$this->head

在Monkey類的__wakeup魔術(shù)方法中,使用了preg_match函數(shù)進(jìn)行正則匹配,也就意味著第二個(gè)參數(shù)?$this->head?必須是一個(gè)字符串。從Monkey類中可以看到,$this->head的值可以來源于構(gòu)造方法,默認(rèn)值為 Zoo,但是這樣使用顯然不可能,因?yàn)榉葱蛄谢臅r(shí)候,是不會調(diào)用構(gòu)造方法的。那么所以只能換一個(gè)方向來思考,$this->head如果是一個(gè)對象呢,當(dāng)把一個(gè)對象當(dāng)成字符串處理時(shí),會觸發(fā)__toString魔術(shù)方法,這條路也許可行。

4、確定__toString所在類

現(xiàn)在有兩個(gè)對象有tostring方法,分別是Elephant和Tiger,選擇哪個(gè)呢,我們的目的是進(jìn)入boss函數(shù)執(zhí)行命令,可以看到Tiger的tostring方法只是返回一個(gè)變量沒啥用,所以就選擇讓$this->head = new Elephant();,此時(shí)會執(zhí)行$this->nice->nose;

5、確定$this->nice

在Elephant的構(gòu)造方法中,也存在對$nice的賦值,但是這類操作并沒有實(shí)際價(jià)值,因?yàn)槲覀兊哪繕?biāo)是要想辦法進(jìn)行跳轉(zhuǎn),要一步一步跳轉(zhuǎn)到別的類當(dāng)中去執(zhí)行代碼,進(jìn)而最終到達(dá)終點(diǎn)。目前還剩下Tiger的__invoke和Lion的__get沒有進(jìn)行跳轉(zhuǎn)和調(diào)用,那么首先需要知道這兩個(gè)魔術(shù)方法的觸發(fā)條件:

(1)__invoke:當(dāng)以函數(shù)方式調(diào)用對象時(shí)被調(diào)用,也就是類似:$a = new A(); $a();這種調(diào)用方式時(shí)觸發(fā)

(2)__get:讀取不可訪問或不存在屬性時(shí)被調(diào)用

那么我們來分析一下,$this->nice為哪個(gè)對象時(shí),可以繼續(xù)往下走。顯然,此處不可能有條件能夠觸發(fā)到__invoke,那么只能選擇觸發(fā)__get,于是令$this->nice = new Lion(),而Lion類并沒有屬性nose,所以完成對Lion類的__get的觸發(fā)

6、確定$this->tail

當(dāng)跳轉(zhuǎn)到Lion類的__get方法時(shí),此時(shí)我們看到兩個(gè)特征,第一:在返回一個(gè)函數(shù),那么這很有可能為下一步準(zhǔn)備以函數(shù)方式調(diào)用對象做了鋪墊,即可以觸發(fā)Tiger類的__invoke方法,目前看起來也許前面的POP正確性比較高。第二:需要確定$this->tail的值,那么按照這個(gè)設(shè)計(jì)來看的話,此處應(yīng)該令$this->tail = new Tiger();?是很有可能正確的。這個(gè)時(shí)候$function就是Tiger對象,而下一步的代碼return $function();恰好可以印證這一點(diǎn),實(shí)現(xiàn)了對象的函數(shù)式調(diào)用,進(jìn)而觸發(fā)Tiger類的__invoke魔術(shù)方法。

7、確定$this->var

進(jìn)到Tiger類的__invoke魔術(shù)方法中時(shí),直接看到了調(diào)用$this->boss()方法,已經(jīng)快到終點(diǎn)了,所以此時(shí),只需要確定$this->var的值便可以完成調(diào)用鏈的構(gòu)造了,此時(shí)問題變簡單了,只需要令$this->var = phpinfo();即可完成構(gòu)造。

8、以終為始

上述分析過程,是以起點(diǎn)開始的,而往往起點(diǎn)通向終點(diǎn)的過程并不一定非常順利,所以也可以將分析過程反過來,以終點(diǎn)開始,逐步推向起點(diǎn),效率也許會更高。如果倒推,順推都是一條路徑,那么足以說明POP鏈?zhǔn)峭耆_的。

四、確定POC

五、總結(jié)

(1)先要確定起點(diǎn)和終點(diǎn),如果起點(diǎn)有多個(gè),那么就去嘗試最有可能進(jìn)行相互跳轉(zhuǎn)的一個(gè),起點(diǎn)和終點(diǎn)無法確定,POP鏈不可能成功。

(2)一定要牢記不同的魔術(shù)方法的自動觸發(fā)條件,如果不太熟悉,則做實(shí)驗(yàn)證明,然后理解它。

(3)自動觸發(fā)的跳轉(zhuǎn)過程,會不停地給類變量(屬性)賦值,一定要知道該賦什么樣的值,通常的值都不會是普通類型,而是對象。

(4)POP鏈的分析和構(gòu)造過程,可以完全忽略非魔術(shù)方法或也鏈條無關(guān)的方法和屬性。

(5)POP的核心在于屬性,而不是方法,序列化和反序列化的核心也在屬性,而不是方法,所以方法對我們構(gòu)造POC是無意義的。


網(wǎng)安 | 反序列化POP調(diào)用鏈構(gòu)造一的評論 (共 條)

分享到微博請遵守國家法律
巩义市| 古蔺县| 东港市| 南阳市| 那坡县| 中宁县| 来安县| 土默特左旗| 齐河县| 和田县| 喜德县| 德令哈市| 班玛县| 乐陵市| 赤水市| 丰台区| 大连市| 贺兰县| 长岛县| 佛教| 绵竹市| 高淳县| 岐山县| 互助| 三门县| 馆陶县| 黄冈市| 铜山县| 潮州市| 陆良县| 台州市| 中宁县| 平南县| 合水县| 屏东县| 抚远县| 石渠县| 方城县| 无棣县| 石河子市| 宿州市|