CTF中的序列化和反序列化
序列化和反序列化概念
序列化就是将对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名
反序列化则相反将字符串重新恢复成对象
对象的序列化利于对象的保存和传输,也可以让多个文件共享对象
序列化中常见的魔法函数
1 | __construct() 创建对象时调用 |
列子
1 | O:3:"Ctf":3{s:4:"flag";s:13:"flag{abedyui}";s:4:"name";s:7:"Sch0lar";s:3:"age";s:2:"18";} |
访问控制修饰符
根据访问控制修饰符的不同 序列化后的 属性长度和属性值会有所不同,所以这里简单提一下
1 |
|
1 | O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}//这里是private属性被序列化 |
绕过—wakeup()函数
当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
反序列化
1 | 1.PHP 在反序列化时,底层代码是以 ; 作为字段的分隔,以 } 作为结尾(字符串除外),并且是根据长度判断内容的 |
PHP字符逃逸导致的对象注入
php反序列化三大特性
- php在反序列化的时候,底层代码是以;作为字段的分隔,以}作为结尾(字符串除外),并且是根据长度判断内容的
- 当长度不对应的时候会出现报错
- 可以反序列化类中不存在的元素