[极客大挑战 2019]PHP 反序列化
1. 题目主页为一个很鬼畜的猫猫,会跟着鼠标晃头
题目说猫猫会踩键盘,所以作者每次都会机制的备份文件,所以这里想到了有备份文件。
一开始使用dirsearch找,发现都是429请求过多,看样子不能自动扫备份文件,根据经验尝试一下 www.tar
www.zip等等,运气比较好的是www.zip为备份文件,下载下来看看。
2. 遍历各个文件,flag.php内的flag是假的,较为有用的是index.php和class.php。
其中index.php关键代码:
这里可以看出,index.php包含了class.php,接受get传参给select,随后序列化处理。
class.php关键代码
class.php中,定义了Name类,有两个私有变量username和password,随后定义了_construct(),_wakeup(),_destruct()函数,分别为,建立对象时会调用的函数,反序列化时首先调用的函数,和析构前调用的函数。
代码审计后发现传入的对象必须为username=admin且password=100才能输出正确的flag,于是构造序列化字符串
由于对象变量为私有变量,序列化后会产生不可见字符%00,将其填入序列化后的字符串中。
3. 在提交参数前,需要注意,反序列化后首先会调用_wakeup()函数,所以需要将序列化后{前的数字改大,大于类中的变量数,利用php序列化的特性,即可绕过_wakeup函数,不提前为变量赋值。
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
payload:
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}