[极客大挑战 2019]PHP

访问链接,根据提示可知,此网站有备份,那么我们用目录扫描器来扫描一下,扫出来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链的构造

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值