LOADING

加载过慢请开启缓存 浏览器默认开启

PHP反序列化2

2023/11/18 漏洞 漏洞 web

PHP反序列化2😶‍🌫️

POP链,魔术方法

分析代码逻辑,构造payload


其他魔术方法

  • __destruct()

    1.用户主动销毁对象
    2.程序结束的时候有引擎自动销毁
    

    1701083712683

  • __toString()

    1701084181165

    如果没有

    echo $a;
    

    则不会调用这个方法

    对象被当作字符串一样调用的时候使用这个方法

  • __callStatic() //在静态上下文中调用不可访问的方法时触发

    1701084919628

    1701084935543

    1701084971264

    1701085067302

    执行结果:

    1701085042623

  • get() //获得一个类的成员变量时调用,用于从不可访问的属性读取数据(不可访问的属性包括:1.属性是私有型。2.类中不存在的成员变量)

    1701086187245

    不存在的属性被调用

  • __set() //用于将数据写入不可访问的属性

    1701086367645

    1701086425120

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

    1701087582663

    1701087558719

  • __wakeup :反序列化恢复对象之前调用该方法

    1701088079461

    1701088092513

  • __isset() //在不可访问的属性上调用iset()或empty()触发

  • __unset() //在不可访问的属性上使用unset()时触发

    1701088623375

    1701088715378

  • __invoke() //当尝试以调用函数的方式调用一个对象时

    1701089557895

    1701089577412

    把对象当做函数去应用了

对象变量属性

public

公有类型

private

私有类型

该类型的属性或方法只能在该类中使用

1701088989740

实例

**<和上面的 *__invoke()* 结合>**:

1701089296210

结果:

1701089168811

原因:

只输出脸变得原因是:这里的 sexpublic 不是私有类,所以只有 name ,age 这两个被 private 修饰的调用方法并且输出结果

protected

受保护类型

在子类中可以调用父类方法

实例2 <序列化时san’zhe>

1701134700629

  • 当变量被private修饰的时候 **序列化之后的格式为: **
     %00类名%00成员名

在这里没有显示**%00** 所以一般对输出的及如果进行编码

  • 当变量被protected修饰的时候 **序列化之后的格式为: **
     %00*%00成员名

语言特性漏洞

上一个笔记里的题目中的***__wakeup()*** 方法的绕过

__wakeup()方法绕过

  • 漏洞影响的版本

    PHP5 < 5.6.25

    PHP7 < 7.0.10

  • 原因

    如果存在 _wakeup() 方法,则调用 unserilize() 方法前先调用 _wakeup() 方法

  • 绕过

    当序列化字符串表示对象属性个数的值大于真实的属性个数的时候就会绕过 _wakeup() 方法

原生类

1701138441516

查看各个方法有哪些原生类