极客大挑战-2019-PHP
[极客大挑战 2019]PHP
1.题目:
2.过程:
提醒有网页的备份,试出来是www.zip:
应该与序列化有关
大概是覆盖username和password,绕过wakeup后通过destruct得到flag,但是一直没有成功……
public、protected与private在序列化时的区别:
protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。
因此保护字段的字段名在序列化时,字段名前面会加上 \0*\0 的前缀,注意,这里的 \0 表示 ASCII 码为 0
的字符,也就是我们经过 urlencode 后看到的 %00 。
private声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。 因此私有字段的字段名在序列化时,字段名前面会加上\0\0 的前缀, 这里 表示的是声明该私有字段的类的类名,而不是被序列化的对象的类名。因为声明该私有字段的类不一定是被序列化的对象的类,而有可能是它的祖先类。
var 和 public声明的字段都是公共字段,因此它们的字段名的序列化格式是相同的。公共字段的字段名按照声明时的字段名进行序列化,但序列化后的字段名中不包括声明时的 变量前缀符号 $。
protected和private属性的变量会有一些不可见的字符
private属性序列化的时候格式是%00类名%00成员名
protecte属性序列化的时候格式是%00*%00成员
PHP7.1以上的反序列化不会判断里面参数的属性类型了,所以可以改成public再进行反序列化,绕过private、protected序列化后产生不可见字符。
这道题还是需要那些不可见字符的,用url编码防止字符丢失。
select=O%3A4%3A”Name”%3A3%3A%7Bs%3A14%3A”%00Name%00username”%3Bs%3A5%3A”admin”%3Bs%3A14%3A”%00Name%00password”%3Bs%3A3%3A”100”%3B%7D
得到flag。
极客大挑战-2019-PHP