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

posted @ 2021-06-25 23:19  lixin-gf666  阅读(238)  评论(0编辑  收藏  举报