Ezpop?pop序列化鏈反序列化知識(shí)
<?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__);
}一大段代碼,隨意瞟一眼看見(jiàn)wakeup等魔法方法,我就知道要利用反序列化了,還有include文件包含漏洞,但這里考的不是如何繞過(guò)反序列化,而是我不知道的序列化POP鏈。
根據(jù)學(xué)習(xí),以下是我的心得:
__invoke:當(dāng)嘗試將該函數(shù)所存在的對(duì)象用函數(shù)方法調(diào)用時(shí)觸發(fā)
__construct:當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí)調(diào)用,類似于構(gòu)造函數(shù)
__toString:當(dāng)對(duì)象被當(dāng)作字符串使用時(shí)調(diào)用
__wakeup:當(dāng)調(diào)用unserialize反序列化的時(shí)候提前調(diào)用
__get:當(dāng)調(diào)用不可訪問(wèn)的屬性時(shí)調(diào)用該函數(shù)(1、私有屬性,2、沒(méi)有初始化的屬性)
現(xiàn)在我們要利用include讀取flag.txt,就肯定要調(diào)用invoke,就必須把這三個(gè)類聯(lián)系在一起,因?yàn)镾how類里面有wakeup函數(shù),include函數(shù)在modifier里面,肯定是最后一個(gè)看,因此我們要從Show類里面看起(先定義一下$a=new Show()):
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";
}wakeup函數(shù)里面是一個(gè)正則表達(dá)式,目前對(duì)我們沒(méi)有多大用處,toString這個(gè)函數(shù)如果被調(diào)用了(目前不知道怎么調(diào)用這個(gè)函數(shù)就先跳過(guò)),會(huì)返回$this->str->source;這時(shí)我們想到,如果$this->str代表的是一個(gè)Test類呢
public function __get($key){
$function = $this->p;
return $function();
}因?yàn)門(mén)est類中沒(méi)有source這個(gè)屬性,因此會(huì)調(diào)用get方法,就這樣可以把Show和Test連接在一起,我們可以構(gòu)造一個(gè)這個(gè):$a->str=new Test();調(diào)用get方法后,很明顯是一個(gè)將$this->看成一個(gè)對(duì)象,用函數(shù)的方法調(diào)用,因此來(lái)引發(fā)invoke方法
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}因此我們繼續(xù)構(gòu)造:$a->str->p=new Modifier();這里需要用到var屬性,我們就可以將var賦值為php://filter/read=convert.base64-encode/resource=flag.php,因?yàn)檫@里沒(méi)有過(guò)濾,就可以放心用。
現(xiàn)在問(wèn)題就是怎么開(kāi)始調(diào)用toString()這個(gè)函數(shù),看了別人的wp說(shuō)可以再實(shí)例化一次,$b=new Show($a);因?yàn)镾how里面的construct函數(shù)是$file='index.php'參數(shù),如果不傳參的話就會(huì)使默認(rèn)值,當(dāng)我們把$a這個(gè)對(duì)象傳入后,this->source=$a,然后遇到正則表達(dá)式,因?yàn)檎齽t表達(dá)式是對(duì)字符串進(jìn)行過(guò)濾嘛,因此$a被當(dāng)作了字符串,因此引發(fā)了toString這個(gè)函數(shù)。
最終我們的構(gòu)造是

這里有點(diǎn)煩的就是由protect屬性,要加%00*%00,這里我學(xué)了一個(gè)小技巧,我們可以給他進(jìn)一步url編碼,可以無(wú)視那些不可見(jiàn)字符,urlencode()

將編碼后的傳入pop參數(shù)


又知道一個(gè)pop序列化鏈的知識(shí)
以上就是Ezpop pop序列化鏈反序列化知識(shí)的詳細(xì)內(nèi)容,更多關(guān)于Ezpop pop序列化鏈反序列化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php正則取img標(biāo)記中任意屬性(正則替換去掉或改變圖片img標(biāo)記中的任意屬性)
因有一項(xiàng)目新聞發(fā)布系統(tǒng),數(shù)據(jù)庫(kù)內(nèi)容字段中存儲(chǔ)的是原圖的路徑(當(dāng)然還有其他文字內(nèi)容啦,內(nèi)容里插圖時(shí),存的是圖片路徑),但前臺(tái)想使用縮略圖,琢磨1小時(shí)余,得到以下結(jié)果,可解決問(wèn)題2013-08-08
php模式設(shè)計(jì)之觀察者模式應(yīng)用實(shí)例分析
這篇文章主要介紹了php模式設(shè)計(jì)之觀察者模式,結(jié)合實(shí)例形式分析了php觀察者模式的原理、應(yīng)用案例與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
使用WAMP搭建PHP本地開(kāi)發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了使用WAMP搭建PHP本地開(kāi)發(fā)環(huán)境的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
php檢測(cè)數(shù)組長(zhǎng)度函數(shù)sizeof與count用法
這篇文章主要介紹了php檢測(cè)數(shù)組長(zhǎng)度函數(shù)sizeof與count用法,實(shí)例分析了count的用法,并對(duì)sizeof函數(shù)進(jìn)行了詳盡的分析說(shuō)明,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11
php實(shí)現(xiàn)的pdo公共類定義與用法示例
這篇文章主要介紹了php實(shí)現(xiàn)的pdo公共類定義與用法,結(jié)合具體實(shí)例形式分析了php實(shí)現(xiàn)的pdo操作類定義及查詢、插入等使用技巧,需要的朋友可以參考下2017-07-07
jQuery+PHP發(fā)布的內(nèi)容進(jìn)行無(wú)刷新分頁(yè)(Fckeditor)
這篇文章主要介紹了jQuery結(jié)合,將Fckeditor發(fā)布的內(nèi)容進(jìn)行無(wú)刷新分頁(yè),需要的朋友可以參考下2015-10-10

