访问链接,根据提示可知,此网站有备份,那么我们用目录扫描器来扫描一下,扫出来www.zipwww.zip
下载www.zip文件,打开后发现是网站的源码
有用的文件时class.php和index.php,先阅读一下index。php,我将代码含义注释在了旁边
接下来看一下class。php的代码
我们重新梳理一下class。php的代码逻辑以及解题思路,
1,__construct方法在这里其实并没有用到
2,__wakeup方法会将username赋值为guest,不符合出flag的条件,因此不能让这个方法执行
3,password需要弱等于100,因为要跳过第一个if语句,不然程序执行不到flag处
4,username要绝对等于admin
满足上诉条件即可,3和4好满足,关键是如何天国__wakeup方法呢,
解:
若在对象的魔法函数中存在的__wakeup方法,那么之后再调用 unserilize () 方法进行反序列化之前则会先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
那么我们构造payload,如下图
将序列化的字符串中的对象属性个数改一下,原本两个对象我们改成三个
原来的:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
修改后的:
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
这里注意,原本生成的序列化字符串中有好几个小方格,但是复制后就没了,我们需要手动写上,看网上说的是将原来小方格的地方写为 %00 ,我也不太清楚为什么,就这样写吧
最终的payload:
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
访问目标地址,成功获取flag
涉及知识点:
1, __construct(),__wakeup(),__destruct()方法的理解
2,__wakeup()方法的绕过
3,php反序列化pop链的构造