46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

03-11 阅读 0评论

文章目录

    • 几种常用的魔术方法
      • 1、__destruct()
      • 2、__tostring()
      • 3、__call()
      • 4、__get()
      • 5、__set()
      • 6、__sleep()
      • 7、__wakeup()
      • 8、__isset()
      • 9、__unset()
      • 9、__invoke()
      • 三种变量属性
      • 极客2019 PHP
      • php原生类

        几种常用的魔术方法

        1、__destruct()

        当删除一个对象或对象操作终止时被调用,其最主要的作用是拿来做垃圾回收机制。当对象销毁时会调用此方法,对象销毁:1.用户主动销毁对象,使用unset()函数;2.当程序结束时由引擎自动销毁。

        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

        2、__tostring()

        在对象当作字符串的时候会被调用。但是需要注意的是,执行完__toString()之后,会有返回值。

        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

        3、__call()

        调用某个方法,若方法存在,则直接调用;若不存在,则会调用__call()方法。

        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

        4、__get()

        读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get()魔术方法。

        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

        5、__set()

        设置一个对象的属性时,若属性存在,则直接赋值;若属性不存在或者无法访问(私有)的属性时,则会调用__set()函数。

        __set($name, $value)

        • 用来为私有成员属性设置属性值;
        • 第一个参数为需要设置值多的属性名,第二个参数为需要设置的属性值,__set方法没有返回值。

          46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

          6、__sleep()

          serialize()之前被调用,可以指定要序列化的对象属性。

          46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

          46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性,46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第9张
          (图片来源网络,侵删)

          7、__wakeup()

          反序列化恢复对象之前调用该方法,也就是使用unserialize()之前会先调用__wakeup()。

          46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

          var_dump会输出反序列化内容。

          8、__isset()

          检测对象的某个属性是否存在时执行该函数,当对不可访问属性调用isset()或empty()时,触发__isset()。

          46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

          9、__unset()

          在不可访问的属性上使用unset()时触发, 或销毁对象的某个属性时执行此函数。

          46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

          • unset()函数不仅触发__unset(),而且会触发__destruct()。
          • 三种对象变量属性:
            • public:在本类内部、外部类、子类中都可以访问;
            • protected:只在本类或子类或父类中可以访问;
            • private:在本类内部可以访问。
            • 序列化数据显示:
              • private属性序列的时候格式是%00类名%00成员名
              • protected属性序列的时候格式是%00*%00成员名
              • 使用new是创建外部类(测试类),子类是通过继承extends父类得到的。

                9、__invoke()

                当调用函数的方式调用一个对象时触发。

                46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

                三种变量属性

                • 三种对象变量属性:
                  • public:在本类内部、外部类、子类中都可以访问;
                  • protected:只在本类或子类或父类中可以访问;
                  • private:在本类内部可以访问。
                  • 序列化数据显示:
                    • private属性序列的时候格式是%00类名%00成员名
                    • protected属性序列的时候格式是%00*%00成员名

                      46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

                      极客2019 PHP

                      反序列化利用大概分为三类:

                      • 魔术方法的调用逻辑,如触发条件;
                      • 语言原生类的调用逻辑,如SoapClient;
                      • 语言自身的安全缺陷,如CVE-2016-7124.

                        首先,通过目录扫描可以发现网站源码保存在www.zip中(这里就不作叙述);

                        index.php中包含flag.php,并且接收select传参,并且对传参内容进行反序列化。

                        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

                        在flag.php中存在一个className,而且flag在__destruct()魔术方法中,有两种方式触发__destruct()魔术方法:1.用户主动销毁对象,使用unset()函数;2.当程序结束时由引擎自动销毁。也就是说,当程序执行完,必定会触发__destruct()魔术方法。因此,我们只需要满足__destruct()魔术方法中的两个条件:username=admin&password=100。由于__wakeup()的存在,使得index.php中的unserialize执行之前,就会自动触发__wakeup()。

                        故获取flag的关键在于:绕过__wakeup()。这里可以使用CVE-2016-7124进行绕过__wakeup()。CVE-2016-7124:对象中的属性个数超过实际属性个数会绕过__wakeup()。

                        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 "NO!!!hacker!!!";
                                    echo "You name is: ";
                                    echo $this->username;echo "";
                                    echo "You password is: ";
                                    echo $this->password;echo "";
                                    die();
                                }
                                if ($this->username === 'admin') {
                                    global $flag;
                                    echo $flag;
                                }else{
                                    echo "hello my friend~~sorry i can't give you the flag!";
                                    die(); 
                                }
                            }
                        }
                        

                        将2改为3,即可获取flag。

                        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

                        php原生类

                        php原生类

                        46、WEB攻防——通用漏洞&PHP反序列化&原生类&漏洞绕过&公私有属性

                        1. PHP有哪些原生类

                          //查找PHP所有原生类
                          

免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]