今天终于拾起来ctf的比赛了,开始了练习之旅。今天写一道bugku上的题目wp,属于利用php源码泄漏的题目吧,我以为不是很简单。。。因此把本身的思路放上来。php
题目源头:http://120.24.86.145:8006/test1/函数
题目打开后获得以下的信息,查看源码后发现post
很显然想让咱们利用源码去获得flag。这里咱们稍微解释下这个源码的意思。this
开始有三个变量:user,file,pass,可是咱们发现这里的pass也就是password没有什么用,因此咱们重点关注前两个变量。看下面的条件spa
(1)这里isset的意思是查看变量是否存在,即user不能为空。.net
(2)3d
file_get_contents是把整个文件读入字符串中,这里也就是把user这个变量(user显然要是一个文件)的内容以字符串的方式读出来而且要和“welcome to the bugkuctf”彻底相等(类型,内容)。code
(3)后面提示了咱们因此咱们要在知足条件以后读取file=hint.php。blog
知道了以上的三个条件后咱们就能够作第一步了,就是如何知足他们的条件!?字符串
这里就要使用php伪协议了。这道题目为了解决第二个条件,要用到 “php://input”协议。大体的意思是让 txt=php://input ,以后在post过去一个字符串
(当传进去的参数做为文件名变量去打开文件时,能够将参数php://传进,同时post方式传进去值做为文件内容,供php代码执行时当作文件内容读取)相似(PS:此时payload还不完整还不能执行哈)
简单来讲就是将指定字符串做为文件传给txt,而后再将user的内容读出来。此时咱们就知足了。
以后咱们获得了
此时根据提示咱们能够把包含的文件读出来了,这里要用到php的第二个伪协议:php://filter
这里放上一个写的详细的blog(关于filter的)http://blog.csdn.net/wy_97/article/details/77431111
即 txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php(简单来讲就是利用伪协议读取所包含文件的base64值)获得
解码获得:
以后能够继续利用伪协议读取一下index.php源码
在index里咱们能读出来:
(1)在hint.php中咱们看到了,因此咱们把index.php改为flag.php看看会有什么结果,发现
这个乱码在index.php中咱们发现是
因此咱们不能直接读flag.php。在index中咱们看到这个意思是file中若是包含‘flag’,那么就会给你退出。因此咱们要想其余办法读flag.php
(2)咱们载去找有用的信息,发现这个else写到若是个人file不包含‘flag’,那么我就会把那个文件包含进来,以后将password反序列化一下。并输出password的结果。而咱们根据上面的hint.php发现,
咱们发现当Flag方法当作字符串执行时,会自动执行 __tostring 方法,方法中写了若是file文件存在,那么就输出file文件中的内容。
这不正是咱们要解决的输出flag.php内容的状况吗???因此咱们要构造一个Flag类型的参数,并把这个参数传给password而后get进去。而且这个file的值要是hint.php(由于要利用hint.php中的函数),即:————根据php序列化的结果
获得: O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} 传入
获得
至此这道题目结束。不过应该会有同窗问为什么payload中有index.php,,我以为index.php是默认的页面,否则你没有办法传给php页面参数,因此应该属于一种套路吧,记住就好。。。。
做为菜鸡,还要继续努力啊:)