好早就遇到过,没有认真的看看。

参考:小边同学

原理:php在反序列化时,如果各个参数正确,将首先执行__wakeup, 不执行 __contruct, 所以可以修改各个参数,让原本的值改变,达到我们想要的目的。

序列化函数: serialize()

反序列化函数: unserialize()

O:4:”Name”:2:{s:8:”username”;s:3:”hih”;s:8:”password”;s:3:”lil”;}

解释一下O代表的是对象,如果是A就是数组,4代表类名的长度,”Name”代表类名,2表示有两个成员变量,后面是成员变量的具体内容,s表示是字符串,8表示长度,username是成员变量的名字,’ ;’后面是改成员的值,长度为3,字符串类型,值为’hih’, ‘;’后面是第二个成员变量的内容。

__wakeup 的绕过

​ 成员数量不对就不会执行wakeup函数,将上面的2改成3就好。

2.private(私有)、protected(保护)属性外部修改

public属性可以被外部修改privateproctected属性无法被对象外部修改

private:在序列化后属性名为,类+变量名,且类使用<0x00>空字符相隔,在页面回显中无法看出

O:4:”Name”:2:{s:8:”<0x00>Name<0x00>username”;s:3:”hih”;s:8:”<0x00>Name<0x00>password”;s:3:”lil”;}

proctected:在序列化后属性名为,***+变量名**,且*使用<0x00>空字符相隔,在页面回显中无法看出

O:4:”Name”:2:{s:8:”<0x00><0x00>username”;s:3:”hih”;s:8:”<0x00><0x00>password”;s:3:”lil”;}

在url中%00为空字符

我喜欢听歌哈哈哈,以后每个博客后面都放一首歌,嘻嘻。