Phar反序列化超詳細介紹
Phar是什么
在百度中得到介紹是這樣的:
在軟件中,PHAR(PHP歸檔)文件是一種打包格式,通過將許多PHP代碼文件和其他資源(例如圖像,樣式表等)捆綁到一個歸檔文件中來實現(xiàn)應用程序和庫的分發(fā)。phar文件本質上是一種壓縮文件,會以序列化的形式存儲用戶自定義的meta-data。當受影響的文件操作函數(shù)調用phar文件時,會自動反序列化meta-data內的內容。
理解為php特有的一種打包方式,需要使用php代碼進行大包,且無法通過普通的工具進行解壓解包。
如何創(chuàng)建一個Phar 文件
創(chuàng)建之前了解Phar文件的組成結構:
stub:phar文件的標志,必須以 <?php xxx; __HALT_COMPILER();?>, 結尾,否則無法識別。xxx可以為自定義內容。
stub這一部分,在了解時發(fā)現(xiàn)其實這樣寫 < __HALT_COMPILER();> 也是可以正常解析的
manifest:phar文件本質上是一種壓縮文件,其中每個被壓縮文件的權限、屬性等信息都放在這部分。這部分還會以序列化的形式存儲用戶自定義的meta-data,這是漏洞利用最核心的地方。
content:被壓縮文件的內容
signature (可空):簽名,放在末尾。
開始之前需要修改配置php.ini配置文件,修改phar.readonly 配置為Off,之后重啟生效
最常見的創(chuàng)建Phar 文件php代碼
<?php class Test{ public $test="test"; } $p = new Test(); $phar = new Phar("test.phar");//要創(chuàng)建的Phar文件名,必須是phar后綴 $phar->startBuffering();//寫入之前開始緩沖Phar寫入操作 $phar->setStub("<?php __HALT_COMPILER();?>");//設置stub $phar->setMetadata($p);//將自定義的meta-data存入manifest,這一部分就是把序列化的對象加入到meta-data $phar->addFromString("test.txt", "test");//添加要壓縮的文件(這一步必須要有,如果不設置就無法生成phar文件,文件隨便) $phar->stopBuffering();//簽名自動計算 ?>
執(zhí)行代碼后會在當前代碼目錄下生成test.phar文件,以文本格式查看test.phar文件,在內容中可以看到Test類被序列化寫入了。O:4:“Test”:1:{s:4:“test”;N;}
如何反序列化利用
我們在構造特殊的meta-data數(shù)據(jù)后,在php中如果使用一些文件系統(tǒng)函數(shù)去引用調用phar文件就會觸發(fā)反序列化,下面是知道創(chuàng)宇測試確認受影響的函數(shù)。
這里使用is_dir函數(shù),這是一個判斷傳入的是否是一個目錄的函數(shù),創(chuàng)建與之前設置meta-data 的一個Test類,__wakeup魔術方法與__destruct 魔術方法在反序列化對象時都會觸發(fā),__destruct 魔術方法是在銷毀時觸發(fā)。
<?php class Test{ function __wakeup() { echo($this ->test) ; } } is_dir('phar://test.phar');//以phar偽協(xié)議的格式傳入 ?>
輸出結果,meta-data中的數(shù)據(jù)被反序列化觸發(fā)了__wakeup魔術方法,打印了test
在學習過程中,發(fā)現(xiàn)存在偽協(xié)議phar://關鍵詞不能出現(xiàn)在開頭的情況,師傅們的繞過方法是,使用下面的方式也能達到一樣的效果。
如果在上傳對phar文件頭進行校驗的檢測,可以根據(jù)相應的文件修改添加文件頭,如gif(GIF89a)
compress.bzip://phar:///test.phar/test.txt
compress.bzip2://phar:///test.phar/test.txt
compress.zlib://phar:///home/sx/test.phar/test.txt
php://filter/resource=phar:///test.phar/test.txt
到此這篇關于Phar反序列化超詳細介紹的文章就介紹到這了,更多相關Phar反序列化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
php將數(shù)據(jù)庫中所有內容生成靜態(tài)html文檔的代碼
比較簡單了,而且我的代碼優(yōu)化也很是問題 比較繁瑣。下面就直接上代碼了2010-04-04