首页 > 技术文章 > [ZJCTF 2019] NiZhuanSiWei 1

r1kka 2021-11-11 16:38 原文

打开环境,能看到源代码

 

先进行代码审计,可以发现用get方式传递了三个参数:$text、$file、$password

首先看text参数,使用了file_get_contents()函数

 

我们可以使用php://input或者data://进行绕过,经测试发现php://input使用不了,所以我这里是使用的data://

直接构造payload:?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=        //welcome to the zjctf 的base64编码

执行后页面就变成了这个样子,源代码也没有别的东西

 

接下来看file参数,可以看见存在useless.php文件,现在就是想着怎样去访问这个文件

先直接使用file=php://fillter/resource=useless.php,经测试发现没有任何回显,接着使用base64编码的形式回显:file=php://filter/read=convert.base64-encode/resource=useless.php

出现了一串base64编码,解码后得到新的源代码

 

 

接下来看第三个参数password,最后会echo一个unserialize($password)的值,根据源码可知,如果我们将想要赋给password的值序列化后,程序再将其反序列化,就可以达到我们的目的

魔术函数 __tostring()会在我们将类当成字符串时自动执行,我们可以利用这一特性来进行序列化

 

 

结合以上,来构造最终的payload:?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

 

 

flag就在源码中

 

推荐阅读