主頁 >  其他 > PHP phar詳解

PHP phar詳解

2021-10-15 21:22:50 其他

一 phar檔案是什么

Jar(Java Archive)檔案,一個應用,包括所有的可執行,可訪問的檔案,都打包進了一個JAR檔案里,使得部署程序十分簡單,

類似于JAR,phar全稱為PHP Archive,phar擴展提供了一種將整個PHP應用程式放入.phar檔案中的方法,以方便移動、安裝,phar檔案的最大特點是將幾個檔案組合成一個檔案的便捷方式,.phar檔案提供了一種將完整的PHP程式分布在一個檔案中并從該檔案中運行的方法,

與 JAR 不同的是Phar 可由 PHP 本身處理,因此不需要使用額外的工具來創建或使用,使用php腳本就能創建或提取它,

phar檔案有三種格式:tar歸檔、zip歸檔、phar歸檔,前兩種執行需要php安裝Phar 擴展支持,用的也比較少,這里主要講phar歸檔格式,

關于phar的官網檔案請見PHP: Phar - Manual

二 phar的創建

1 修改php.ini組態檔

PHAR檔案預設狀態是只讀的,使用Phar檔案不需要任何的配置,部署非常方便,因為我們現在需要創建一個自己的Phar檔案,所以需要允許寫入Phar檔案,這需要修改一下 php.ini

我的php.ini檔案中,phar.readonly = On,

[Phar]
; http://php.net/phar.readonly
;phar.readonly = On

首先在php.ini中修改phar.readonly這個選項,去掉前面的分號,并改值為off,由于安全原因該選項默認是on,如果在php.ini中是禁用的(值為0或off),那么在用戶腳本中可以開啟或關閉,如果在php.ini中是開啟的,那么用戶腳本是無法關閉的,所以這里設定為off來展示示例,

現在,我們就可以來把PHP應用打包成Phar檔案了,

2 創建我們自己的PHP檔案專案

這里我都是借助別人博客的專案直接Copy的,并沒有進行演示,因為我整理本篇博客的初衷是為了解phar://漏洞打ctf的,所以其中的檔案名就按照原作者的不進行修改了,最后會加上參考文章的,

首先我要按按照一個的規則創建應用的目錄結構,根目錄為project,project下的目錄如下面這樣:

file
    -yunek.js
    -yunke.css
lib
    -lib_a.php
template
    -msg.html
index.php
Lib.php

其中file檔案夾有兩個內容為空的js和css檔案,僅僅演示phar可以包含多種檔案格式

lib_a.php內容如下:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:23
 */
function show(){
    echo "l am show()";
}
 

msg.html內容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>phar</title>
</head>
<body>
<?=$str; ?>
</body>
</html>
 

index.php內容如下:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:17
 */
require "lib/lib_a.php";
show();
 
$str = isset($_GET["str"]) ? $_GET["str"] : "hello world";
include "template/msg.html";
 

Lib.php內容如下:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:20
 */
function yunke()
{
    echo "l am yunke()";
}
 

3 創建phar檔案

專案檔案準備好了,現在在project檔案夾同級目錄建立一個yunkeBuild.php,用于產生phar格式檔案,內容如下:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:36
 */
 
//產生一個yunke.phar檔案
$phar = new Phar('yunke.phar', 0, 'yunke.phar');
// 添加project里面的所有檔案到yunke.phar歸檔檔案
$phar->buildFromDirectory(dirname(__FILE__) . '/project');
//設定執行時的入口檔案,第一個用于命令列,第二個用于瀏覽器訪問,這里都設定為index.php
$phar->setDefaultStub('index.php', 'index.php');
 

然后在瀏覽器中訪問這個yunkeBuild.php檔案,將產生一個yunke.phar檔案,此時服務器根目錄結構如下:

project

yunkeBuild.php

yunke.phar

這就是產生一個phar歸檔檔案最簡單的程序了,

這里我再做一些其他的補充,方便更好的理解:

1)phar檔案的產生是通過訪問yunkeBuild.php,相當于執行,因此可以在終端執行如下代碼產生

aabouzekry@platinum:~/myapp$ php yunkeBuild.php

然后就產生了yunke.phar檔案,

2)new phar()產生phar物件,對其中的引數進行一下解讀,

<?php
$phar = new Phar("/yunke.phar", 
        FilesystemIterator::CURRENT_AS_FILEINFO |
        FilesystemIterator::KEY_AS_FILENAME, "yunke.phar");

解釋:

一個新 Phar 物件的創建通常需要三個引數,

第一個引數是Phar檔案的路徑,你不僅可以通過它創建Phar檔案,還可以對現存的Phar檔案進行操作,

第二個引數是設定 Phar 物件如何處理檔案,Phar 物件繼承了 PHP RecursiveDirectoryIterator 物件,這個引數是直接傳遞到父類里,這里提供的值是RecursiveDirectoryIterator 的預設值,能滿足目前的要求,

第三個引數是Phar檔案的別名,在內部參考這個Phar檔案時都要使用這個別名,

通常只需傳入檔案名,也就是第三個引數,

3) 往phar中添加檔案,添加檔案有幾種如下方法:

  • 手動添加已有檔案

呼叫類方法Phar::addFile($filepath,$localpath=?)添加檔案,引數是檔案絕對路徑和(可選)存盤到phar的相對路徑

<?php
	$phar = new Phar('yunke.phar');
	$phar->addFile('test.php');
	include('phar://yunke.phar/test.php') // in test.php
?>

這里出現的phar://就是訪問phar檔案的一種方法,所以不需要太在意,

  • 以字串添加檔案內容

呼叫類方法Phar::addFromString($localpath,$contents)以字串形式添加檔案

<?php
	$phar = new Phar('yunke.phar');
	$phar->addFromString('test.php','<?php echo \'in test.php\'?>');
	include('phar://yunke.phar/test.php'); // in test.php
?>

  • 添加空目錄

呼叫類方法Phar::addEmptyDir($dirname)添加空目錄,使用方法Phar::getContent()獲取檔案結構

<?php
	$phar = new Phar('yunke.phar');
	$phar->addEmptyDir('test'); // yunke.phar/test/
?>
  • 手動選擇添加已有目錄

呼叫類方法Phar::buildFromDirectory($dir,$pattern = "")添加整個目錄

<?php
	$phar = new Phar('yunke.phar');
	$phar->buildFromDirectory('test'); // test.php in test/
	include('phar://yunke.phar/test/test.php'); // in test/test.php
?>

4) 存根檔案Stub,理解這個很重要,

歸檔檔案中有一個存根檔案stub,其實就是一段php執行代碼,在制作歸檔時可以設定,直接執行歸檔檔案時,其實就是執行它,所以它是啟動檔案;在腳本中包含歸檔檔案時就像包含普通php檔案一樣包含它并運行,但直接以phar://的方式包含歸檔中某一個檔案時不會執行存根代碼, 往往在存根檔案里面require包含要運行的其他檔案,對存根檔案的限制僅為以__HALT_COMPILER(); 結束,默認的存根設計是為在沒有phar擴展時能夠運行,它提取phar檔案內容到一個臨時目錄再執行,不過從php5.3開始該擴展默認內置啟用了,

stub是phar檔案的檔案頭,格式為...<?php ...;__HALT_COMPILER();?>,…可以是任意字符,包括留空,且php閉合符與最后一個分號之間不能有多于一個的空格符,另外php閉合符也可省略,最短省略閉合符的stub是<?php __HALT_COMPILER();?>

運行Phar檔案時,stub檔案被當做一個meta檔案來初始化Phar, 并告訴Phar檔案在被呼叫時該做什么,

在我們的例子中,使用的是 createDefaultStub() 方法,

其他的方式如下:

方法一:呼叫類方法Phar::setStub($string)為實體創建自定義stub

<?php
	$phar = new Phar('yunke.phar');
	$phar->setStub('<?php echo \'in stub!\';__HALT_COMPILER();?>');
	include('phar://yunke.phar');	// in stub!
?>

也可以

$phar->setStub($phar->createDefaultStub("index.php"));

生成的預設stub檔案包含如下的代碼:

<?php
Phar::mapPhar();
include "phar://yunke.phar/index.php";
__HALT_COMPILER();

createDefaultStub() 方法預設創建的stub檔案的內容很簡單, Phar::mapPhar() 用來分析Phar檔案的元資料,并初始化它,stub檔案的結尾處需要呼叫 __HALT_COMPILER() 方法,這個方法后不能留空格,__HALT_COMPILER() 會立即終止PHP的運行,防止include的檔案在此方法后仍然執行,這是Phar必須的,沒有它Phar將不能正常運行,

除此之外,我們還可以創建自己的stub檔案來執行自定義的初始化程序,像這樣加載自定義檔案

<?php
$phar->setStub(file_get_contents("stub.php"));

方法二:使用默認stub,呼叫類方法Phar::setDefaultStub()為實體設定默認stub,使用方法Phar::getStub()獲取實體的stub

<?php
    $phar = new Phar('yunke.phar');
    $phar->setDefaultStub();
    print_r($phar->getStub()); // 2, 'c' => 'text/plain', 'cc' => 'text/plain', ...
?>

如果預設創建stub,PHP會使用默認stub

<?php
	$phar = new Phar('yunke.phar');
	$phar['demo.txt'] = 'demo';
	print_r($phar->getStub()); // 2, 'c' => 'text/plain', 'cc' => 'text/plain', ...
?>

4 phar檔案的運行

我們在服務器根目錄建立一個index.php檔案來演示如何使用上面創建的phar檔案,內容如下:

<?php
 
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/8
 * Time: 9:33
 */
 
require "yunke.phar";
require "phar://yunke.phar/Lib.php";
yunke();
 

如果index.php檔案中只有第一行,那么和不使用歸檔檔案時,添加如下代碼完全相同:

require "project/index.php";

如果沒有第二行,那么第三行的yunke()將提示未定義,所以可見require一個phar檔案時并不是匯入了里面所有的檔案,而只是匯入了入口執行檔案而已,但在實際專案中往往在這個入口檔案里匯入其他需要使用的檔案,在本例中入口執行檔案為project/index.php,

補充:

可以為歸檔設定別名,別名保存在歸檔檔案中永久保存,它可以用一個簡短的名字參考歸檔,而不管歸檔檔案在檔案系統中存盤在那里,設定別名:

$phar = new Phar('lib/yunke.phar', 0);
$phar->setAlias ( "yun.phar");

設定別名后可以如下使用:

<?php
require "lib/yunke.phar";
require "phar://yun.phar/Lib.php";  //使用別名訪問歸檔檔案
require "phar://lib/yunke.phar/Lib.php"; //當然仍然可以使用這樣的方式去參考

如果在制作phar檔案時沒有指定別名,也可以在存根檔案里面使用Phar::mapPhar('yunke.phar');指定,

5 phar檔案的提取還原

我們有時候會好奇phar里面包含的檔案原始碼,這個時候就需要將phar檔案還原,如果只是看一看的話可以使用一些ide工具,比如phpstorm 10就能直接打開它,如果需要修改那么就需要提取操作了,為了演示,我們下載一個composer.phar放在服務器目錄,在根目錄建立一個get.php檔案,內容如下:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/9
 * Time: 19:02
 */
 
$phar = new Phar('composer.phar');
$phar->extractTo('composer'); //提取一份原專案檔案
$phar->convertToData(Phar::ZIP); //另外再提取一份,和上行二選一即可

用瀏覽器訪問這個檔案,即可提取出來,以上列子展示了兩種提取方式:

第二行將建立一個composer目錄,并將提取出來的內容放入;

第三行將產生一個composer.zip檔案,解壓即可得到提取還原的專案檔案,

至于phar://偽協議造成的服務器驗證繞過:

可以查看如下幾篇博客:

一個phar://的漏洞_Xi4or0uji-CSDN博客_phar://

3webdogs Day1 第二題:[網鼎杯 2020 總決賽]Game Exp_peri0d的博客-CSDN博客

參考:

PHP開發常識:什么是Phar? – WEB駭客

php歸檔格式:phar檔案詳解(創建、使用、解包還原提取)_云客的技術博客【云游天下 做客四方】-CSDN博客_phar檔案
『PHP』phar檔案詳解_phar檔案格式_呼叫phar類方法生成phar檔案_東京沒有下雨天-CSDN博客

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316376.html

標籤:其他

上一篇:乒乓球游戲在C#中使用列舉作為方向玩家

下一篇:ifelse陳述句中的sum()條件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more