O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
这个序列化字符串看起来是PHP的序列化格式。PHP中的serialize()
函数可以将数据结构转换为字符串,以便在存储或传输时使用,然后可以使用unserialize()
函数将其还原为原始数据结构。这个字符串表示一个包含两个属性的对象。
解析这个字符串:
O:4:"Name":2:{...}
:这部分表示一个对象(Object),其类名为 “Name”,包含两个属性。s:14:"Nameusername";s:5:"admin";
:这部分表示对象的第一个属性。属性名为 “Nameusername”,其值是 “admin”。其中,s
表示字符串,14
表示字符串的长度,然后后面跟着实际的字符串值 “admin”。s:14:"Namepassword";i:100;
:这部分表示对象的第二个属性。属性名为 “Namepassword”,其值是整数 100。i
表示整数,后面跟着整数值 100。所以,这个序列化字符串表示一个名为 “Name” 的对象,它有两个属性 “Nameusername” 和 “Namepassword”,分别对应字符串 “admin” 和整数 100。
在反序列化的时候会首先执行__wakeup()
魔术方法,但是这个方法会把我们的username重新赋值,所以我们要考虑的就是怎么跳过__wakeup()
,而去执行__destruct
。
在反序列化时,当前属性个数大于实际属性个数时,就会跳过__wakeup(),去执行__destruct
于是我们这样构造pyload:
?select=O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}