php反序列化漏洞的认识与学习
php序列化
序列化,即将php对象转换成字符串的一种操作,目的是为了有效地保护对象,并且不丢失其类型和结构
反序列化,即将符合格式的字符串转换为php对象,这个对象的类必须在反序列化之前定义,可以通过包含一个定义该类的文件来完成
序列化后
O:4:”text”:3:{s:10:”textflag”;s:7:”*text”;s:4:”text”;s:5:”text1”;}
String:s
Integer:i
Boolean:b
Null:N
Array:a
Object:o

魔术方法
- __construct() //当对象创建的时候自动调用(但是在unserialize()时是不会自动调用的)
- __wakeup()//当unserialize()时自动调用
- __destruct()//当对象被销毁时自动调用
- __toString()//当反序化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
- __get()//当从不可访问的属性读取数据
- __call()//在上下文中调用不可访问方法时触发
__wakeup()绕过
php5<5.6.25
php7<7.0.10
unserialize()会检查一个__wakeup()方法,如果存在,则会先调用—-wakeup()方法,预先准备对象需要的资源
反序列化时,如果对象属性个数值大于真实的属性个数时就会跳过__wakeup()的执行
构造pop链
POP面向属性编程常用于上层语言构造特定调用连的方法,与二进制利用中的面向返回编程的原理相同,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构造一组连续的调用链,最终达到攻击者的目的。