怎么浅析phar反序列化漏洞攻击及实战
怎么淺析phar反序列化漏洞攻擊及實戰,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
前言
phar反序列化漏洞很久之前就開始接觸了;因為當時出了點問題導致一直無法成功,所以當時直接去學習其他的漏洞了;今天覺得是時候把這個漏洞補上去了;
漏洞成因
phar文件會以序列化的形式存儲用戶自定義的meta-data;該方法在文件系統函數(file_exists()、is_dir()等)參數可控的情況下,配合phar://偽協議,可以不依賴unserialize()直接進行反序列化操作
原理分析
phar的組成
通過查閱手冊發現phar由四部分組成;翻閱手冊可以知道,phar由四個部分組成,分別是stub、manifest describing the contents、 the file contents、 [optional] a signature for verifying Phar integrity (phar file format only) 下面進行解釋一下;
1 .0 a stub
標識作用,格式為xxx<?php xxx; __HALT_COMPILER();?>,前面任意,但是一定要以__HALT_COMPILER();?>結尾,否則php無法識別這是一個phar文件;
2 .0 a manifest describing the contents
其實可以理解為phar文件本質上是一中壓縮文件,其中包含有壓縮信息和權限,當然我們需要利用的序列化也在里面;
圖片選自于 seebug
3 .0 the file contents
這里指的是被壓縮文件的內容;
4 .0 [optional] a signature for verifying Phar integrity (phar file format only)
簽名,放在結尾;
試驗
這里引用開心師傅給的一個實例;來進行生成;
<?php
classTestObject{
}
@unlink("phar.phar");
$phar=newPhar("phar.phar");//后綴名必須為phar
$phar->startBuffering();
$phar->setStub("<?php__HALT_COMPILER();?>");//設置stub
$o=newTestObject();
$phar->setMetadata($o);//將自定義的meta-data存入manifest
$phar->addFromString("test.txt","test");//添加要壓縮的文件
//簽名自動計算
$phar->stopBuffering();
?>
然后在服務器之下運行,發現成功生成phar文件;
然后打開這個phar文件,我們發現已經成功;并且數據的存儲方式是以序列化的方式存儲的;
那么既然有序列化,那么就一定有反序列化,php的很多文件系統函數在通過phar://偽協議解析phar文件的時候。都會將mate-data進行反序列化。
將phar偽造為其他類型的文件
前面在講的時候已經介紹了phar的四個部分,這里注意到第一個部分stub;因為這個部分的存在,縱然我們修改了phar后綴,服務器讀取到stub的時候依然會當作phar文件;再準確點講就是下面的代碼;(二進制的編譯器有點問題,簡單用記事本來看看;)也還是可以發現是以序列化形式存儲的;
實戰
拿一道 SWPUCTF 中的一道題目來講;進去就發現了包含漏洞,然后直接讀取源碼,發現并沒有對phar進行過濾;而且源代碼里有提示,所以差不多實錘了,就是phar反序列化漏洞了;
直接來對關鍵的代碼進行分析;class.php
這里面看到有三個類,再明顯不過了,這就是主要的pop鏈的構造處;然后發現了危險的函數 file_get_contents();那看來就是利用這個讀源碼了;
一步步分析;先看到C1e4r這個類里面有echo;那要利用echo;以達到輸出字符串的目的;
然后看到show類里有一個 __toString()方法,這個方法在對象被轉化為字符串的時候會自動調用;比如進行echo print的時候會進行調用并返回一個字符串;
然后審計Test類,發現file_get_contents()函數,那就是利用了;一步一步向前追溯 file_get->get->__get();這里主要還是調用__get()方法;
那么這里思路差不多清晰了;簡單來講;在test類中要調用__get方法,那么觸發這個方法我們需要在show類里尋,因為這個類里面運用了source屬性,所以只需要將 str['str'] 賦值為 Test類就可以,那么觸發 __toString()方法就需要用到我們的第一個類里面的echo了;
那么思路清晰就構造處pop鏈;
exp編寫
生成phar文件,改后綴為gif繞過限制,上傳之后進入upload目錄之下(或者根據源代碼算出上傳后的文件名),復制文件名到讀取文件的窗口讀取 file=phar://xxxxxx.jpg然后得到base64的編碼解碼就好;
總結
以上是生活随笔為你收集整理的怎么浅析phar反序列化漏洞攻击及实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux安装 Screen出现的问题
- 下一篇: 参考文献引用网页怎么标注 ?