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


    几种常用的魔术方法

    1、__destruct()

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

    2、__tostring()

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

    3、__call()

    调用某个方法,若方法存在,则直接调用;若不存在,则会调用__call()方法。
    在这里插入图片描述

    4、__get()

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

    5、__set()

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

    __set($name, $value)

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

    在这里插入图片描述

    6、__sleep()

    serialize()之前被调用,可以指定要序列化的对象属性。
    在这里插入图片描述

    7、__wakeup()

    反序列化恢复对象之前调用该方法,也就是使用unserialize()之前会先调用__wakeup()
    在这里插入图片描述

    var_dump会输出反序列化内容。

    8、__isset()

    检测对象的某个属性是否存在时执行该函数,当对不可访问属性调用isset()empty()时,触发__isset()
    在这里插入图片描述

    9、__unset()

    在不可访问的属性上使用unset()时触发, 或销毁对象的某个属性时执行此函数。
    在这里插入图片描述

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

    9、__invoke()

    当调用函数的方式调用一个对象时触发。
    在这里插入图片描述

    三种变量属性

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

    在这里插入图片描述

    极客2019 PHP

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

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

    首先,通过目录扫描可以发现网站源码保存在www.zip中(这里就不作叙述);
    index.php中包含flag.php,并且接收select传参,并且对传参内容进行反序列化。

    在这里插入图片描述
    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(); } } }
    • 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

    2改为3,即可获取flag。
    在这里插入图片描述

    php原生类

    php原生类
    在这里插入图片描述

    1. PHP有哪些原生类

      //查找PHP所有原生类
      <?php
      $classes = get_declared_classes();
      foreach ($classes as $class) {
      	$methods = get_class_methods($class);
      	foreach ($methods as $method) {
          	if (in_array($method, array(
              	'__destruct',
              	'__toString',
              	'__wakeup',
              	'__call',
              	'__callStatic',
              	'__get',
              	'__set',
              	'__isset',
              	'__unset',
              	'__invoke',
              	'__set_state'
          	))) {
              	print $class . '::' . $method . "\n";
          	}
      	}
      } 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    2. 常见使用的原生类
      浅析PHP原生类

    3. 配合官方文档利用php原生类

    4. 反序列化字符逃逸
      [安恒月赛]反序列化字符逃逸

  • 相关阅读:
    python reportlab 生成多页pdf
    php敏感词汇替换,或者返回触及了哪个敏感词
    【技术分析】恶意 SPL 代币识别指南
    16.RedHat认证-Ansible自动化运维(中)
    MIGO新增页签增强
    产品思维训练 | 为什么很多家喻户晓的品牌还要继续投广告?
    redis无法远程连接的所有解决方案大全
    java - 序列化
    IDEA升级后老文件夹占用大量存储空间
    Python——实现微博评论情绪分析(生成情绪时空分布地图(pyecharts))
  • 原文地址:https://blog.csdn.net/qq_55202378/article/details/136348955