PHP反序列化2😶🌫️
POP链,魔术方法
分析代码逻辑,构造payload
其他魔术方法
__destruct()
1.用户主动销毁对象 2.程序结束的时候有引擎自动销毁
__toString()
如果没有
echo $a;
则不会调用这个方法
对象被当作字符串一样调用的时候使用这个方法
__callStatic() //在静态上下文中调用不可访问的方法时触发
执行结果:
get() //获得一个类的成员变量时调用,用于从不可访问的属性读取数据(不可访问的属性包括:1.属性是私有型。2.类中不存在的成员变量)
不存在的属性被调用
__set() //用于将数据写入不可访问的属性
__sleep() :在serialize之前被调用,可以指定要序列化的对象属性
__wakeup :反序列化恢复对象之前调用该方法
__isset() //在不可访问的属性上调用iset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当尝试以调用函数的方式调用一个对象时
把对象当做函数去应用了
对象变量属性
public
公有类型
private
私有类型
该类型的属性或方法只能在该类中使用
实例
**<和上面的 *__invoke()* 结合>**:
结果:
原因:
只输出脸变得原因是:这里的 sex 为 public 不是私有类,所以只有 name ,age 这两个被 private 修饰的调用方法并且输出结果
protected
受保护类型
在子类中可以调用父类方法
实例2 <序列化时san’zhe>
- 当变量被private修饰的时候 **序列化之后的格式为: **
%00类名%00成员名
在这里没有显示**%00** 所以一般对输出的及如果进行编码
- 当变量被protected修饰的时候 **序列化之后的格式为: **
%00*%00成员名
语言特性漏洞
上一个笔记里的题目中的***__wakeup()*** 方法的绕过
__wakeup()方法绕过
漏洞影响的版本
PHP5 < 5.6.25
PHP7 < 7.0.10
原因
如果存在 _wakeup() 方法,则调用 unserilize() 方法前先调用 _wakeup() 方法
绕过
当序列化字符串表示对象属性个数的值大于真实的属性个数的时候就会绕过 _wakeup() 方法
原生类
查看各个方法有哪些原生类