知识点
魔术方法:
共有&私有&保护
语言模式方法漏洞
原生类获取利用配合
案例
方法&属性-调用详解&变量数据详解
CTF-语言漏洞-__wakeup()方法绕过
CTF-方法原生类-获取&利用&配合其他
方法&属性-调用详解&变量数据详解
__toString 方法,当对象被当成字符串时,就会调用该方法
__CALL 魔术方法 调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数
__get 魔术方法 读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用get 方法
__set 魔术方法 设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数
__sleep 魔术方法 serialize之前被调用,可以指定要序列化的对象属性
注:只要用到了序列化函数,就会触发sleep函数
__wakeup 魔术方法 当使用unserialize时候会被调用
__isset 魔术方法 当对不可访问属性调用isset()或empty()时,__isset()会被调用
unset 函数使用触发 __unset ,当对不可访问属性调用unset时,__unset会被调用
__invoke,当尝试以调用函数的方法调用一个对象时,会被自动调用
注:不可访问属性指private ,public是公共的可访问的 ,数据类型得属于私有才可以
private属性序列化的时候格式是%00类名%00成员名
protect属性序列化的时候格式是%00*%00成员名
%00在实际显示的时候是看不到的
例子:这里的类名是test,然后age这个属性时private,所以在这个属性前加上了test,age+test一共是7个字符,然后再加上两个%00,一共是9个字符,所以显示字符数为9
CTF-语言漏洞-__wakeup()方法绕过
极客大挑战-2019
利用语言自身的安全缺陷-CVE-2016-7124,多加一个类名就可以绕过