[极客大挑战 2019]PHP
- 打开后,按照提示找备份文件
-
用御剑没扫到东西,换个工具dirsearch
-
找到备份文件
-
在url栏构造下载
http://f0ff483f-62c5-4bf6-9e34-5e02147967e0.node3.buuoj.cn/www.zip -
解压文件,查看flag,假的。。
- 审计一下这几个的代码吧
- flag.php里的$flag 给了个值Syc{dog_dog_dog_dog},好像没啥用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JirQepnC-1612329916646)(media/48179c6eecd1ccf0d54bc3fc01c37add.png)]
-
index.php里的一块代码
-
unserialize() 函数用于将通过
函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。- unserialize的漏洞在magic
function上,如果一个类定义了__wakup()和__destruct(),则该类的实例被反序列化时,会自动调用__wakeup(),
生命周期结束时,则调用__desturct()。这里就利用这个漏洞
- unserialize的漏洞在magic
-
看一下class.php
-
根据代码的意思,我们可以发现如果username=admin
password=100然后我们再执行__destruct()时可以获得flag -
构造序列化
-
然后运行得到json
-
O:4:“Name”:2:{s:14:“Nameusername”;s:5:“admin”;s:14:" Namepassword";i:100;}
-
但是反序列化会先执行__wakeup()魔术方法,username会重新赋值。。所以应该想办法跳过__wakeup(),执行__destruct
-
在反序列化时,当前属性个数大于实际属性个数时,就会跳过__wakeup(),去执行__destruct
-
于是我们这样构造payload:
-
?select=O:4:“Name”:2{s:14:“Nameusername”;s:5:“admin”;s:14:“Namepassword”;i:100;}
-
而这个变量是private的,只能在声明的类中访问,因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度
-
?select=O:4:“Name”:3:{s:14:"%00Name%00username";s:5:“admin”;s:14:"%00Name%00password";i:100;}