[极客大挑战 2019]PHP

反序列化的题,也刚好补了我一点php的知识   private与public的区别.......

有备份网站的好习惯,F12一看没有什么东西,肯定就是泄露源码里了,御剑还是扫不出来,disearch可以

在index.php中

 会接受select参数,并且反序列化,

 如果用户名等于admin 密码等于100  就可以获取flag

但是__wakeup()   在反序列化前会把admin覆盖成guest

必须要绕过,经典的绕过方法:

CVE-2016-7124

当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

绕过wakeup的同时,还要注意private

之前遇到很多反序列化的题,变量都是public

我第一次构造pop链的时候也没仔细看,疯狂报错的同时,序列化得内容也是有问题,我这才看见了 private

搜了一下 private与public反序列化时的区别

还搜到了 protected反序列化的区别  

摘自https://blog.csdn.net/weixin_44077544/article/details/103542260
protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上*的前缀。这里的 表示 ASCII 码为 0 的字符(不可见字符)。这里的 表示 ASCII 码为 0 的字符(不可见字符),而不是 组合。这也许解释了,为什么如果直接在网址上,传递*username会报错,因为实际上并不是,只是用它来代替ASCII值为0的字符。必须用python传值才可以
private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度。其中 0 字符也是计算长度的。

pop:

 

还看到有师傅不用python提交,可以用%00 

payload:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
原文地址:https://www.cnblogs.com/tiaopidejun/p/12487548.html