绕过__wakeup()

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

这个序列化字符串看起来是PHP的序列化格式。PHP中的serialize()​函数可以将数据结构转换为字符串,以便在存储或传输时使用,然后可以使用unserialize()​函数将其还原为原始数据结构。这个字符串表示一个包含两个属性的对象。

解析这个字符串:

  1. O:4:"Name":2:{...}​:这部分表示一个对象(Object),其类名为 “Name”,包含两个属性。
  2. s:14:"Nameusername";s:5:"admin";​:这部分表示对象的第一个属性。属性名为 “Nameusername”,其值是 “admin”。其中,s​ 表示字符串,14​ 表示字符串的长度,然后后面跟着实际的字符串值 “admin”。
  3. 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;}