您好,登錄后才能下訂單哦!
怎么淺析phar反序列化漏洞攻擊及實(shí)戰(zhàn),很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
phar反序列化漏洞很久之前就開始接觸了;因?yàn)楫?dāng)時(shí)出了點(diǎn)問題導(dǎo)致一直無法成功,所以當(dāng)時(shí)直接去學(xué)習(xí)其他的漏洞了;今天覺得是時(shí)候把這個(gè)漏洞補(bǔ)上去了;
phar文件會以序列化的形式存儲用戶自定義的meta-data;該方法在文件系統(tǒng)函數(shù)(file_exists()、is_dir()等)參數(shù)可控的情況下,配合phar://偽協(xié)議,可以不依賴unserialize()直接進(jìn)行反序列化操作
通過查閱手冊發(fā)現(xiàn)phar由四部分組成;翻閱手冊可以知道,phar由四個(gè)部分組成,分別是stub、manifest describing the contents、 the file contents、 [optional] a signature for verifying Phar integrity (phar file format only) 下面進(jìn)行解釋一下;
標(biāo)識作用,格式為xxx<?php xxx; __HALT_COMPILER();?>,前面任意,但是一定要以__HALT_COMPILER();?>結(jié)尾,否則php無法識別這是一個(gè)phar文件;
其實(shí)可以理解為phar文件本質(zhì)上是一中壓縮文件,其中包含有壓縮信息和權(quán)限,當(dāng)然我們需要利用的序列化也在里面;
圖片選自于 seebug
這里指的是被壓縮文件的內(nèi)容;
4 .0 [optional] a signature for verifying Phar integrity (phar file format only)
簽名,放在結(jié)尾;
這里引用開心師傅給的一個(gè)實(shí)例;來進(jìn)行生成;
<?php class TestObject { } @unlink("phar.phar"); $phar = new Phar("phar.phar"); //后綴名必須為phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //設(shè)置stub $o = new TestObject(); $phar->setMetadata($o); //將自定義的meta-data存入manifest $phar->addFromString("test.txt", "test"); //添加要壓縮的文件 //簽名自動計(jì)算 $phar->stopBuffering(); ?>
然后在服務(wù)器之下運(yùn)行,發(fā)現(xiàn)成功生成phar文件;
然后打開這個(gè)phar文件,我們發(fā)現(xiàn)已經(jīng)成功;并且數(shù)據(jù)的存儲方式是以序列化的方式存儲的;
那么既然有序列化,那么就一定有反序列化,php的很多文件系統(tǒng)函數(shù)在通過phar://偽協(xié)議解析phar文件的時(shí)候。都會將mate-data進(jìn)行反序列化。
前面在講的時(shí)候已經(jīng)介紹了phar的四個(gè)部分,這里注意到第一個(gè)部分stub;因?yàn)檫@個(gè)部分的存在,縱然我們修改了phar后綴,服務(wù)器讀取到stub的時(shí)候依然會當(dāng)作phar文件;再準(zhǔn)確點(diǎn)講就是下面的代碼;(二進(jìn)制的編譯器有點(diǎn)問題,簡單用記事本來看看;)也還是可以發(fā)現(xiàn)是以序列化形式存儲的;
拿一道 SWPUCTF 中的一道題目來講;進(jìn)去就發(fā)現(xiàn)了包含漏洞,然后直接讀取源碼,發(fā)現(xiàn)并沒有對phar進(jìn)行過濾;而且源代碼里有提示,所以差不多實(shí)錘了,就是phar反序列化漏洞了;
直接來對關(guān)鍵的代碼進(jìn)行分析;class.php
這里面看到有三個(gè)類,再明顯不過了,這就是主要的pop鏈的構(gòu)造處;然后發(fā)現(xiàn)了危險(xiǎn)的函數(shù) file_get_contents();那看來就是利用這個(gè)讀源碼了;
一步步分析;先看到C1e4r這個(gè)類里面有echo;那要利用echo;以達(dá)到輸出字符串的目的;
然后看到show類里有一個(gè) __toString()方法,這個(gè)方法在對象被轉(zhuǎn)化為字符串的時(shí)候會自動調(diào)用;比如進(jìn)行echo print的時(shí)候會進(jìn)行調(diào)用并返回一個(gè)字符串;
然后審計(jì)Test類,發(fā)現(xiàn)file_get_contents()函數(shù),那就是利用了;一步一步向前追溯 file_get->get->__get();這里主要還是調(diào)用__get()方法;
那么這里思路差不多清晰了;簡單來講;在test類中要調(diào)用__get方法,那么觸發(fā)這個(gè)方法我們需要在show類里尋,因?yàn)檫@個(gè)類里面運(yùn)用了source屬性,所以只需要將 str['str'] 賦值為 Test類就可以,那么觸發(fā) __toString()方法就需要用到我們的第一個(gè)類里面的echo了;
那么思路清晰就構(gòu)造處pop鏈;
生成phar文件,改后綴為gif繞過限制,上傳之后進(jìn)入upload目錄之下(或者根據(jù)源代碼算出上傳后的文件名),復(fù)制文件名到讀取文件的窗口讀取 file=phar://xxxxxx.jpg然后得到base64的編碼解碼就好;
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。