PHP反序列化入门题

每一天都是新的一天,每一天都会接受新的信息,每一天都会有新的成长,昨天接到一个付费咨询,一直到晚上睡前才记起来,客户是一个大一学生,参加了大学的网络安全社团,然后遇到了一道题目,想求助我帮忙解决~

这题考察的是PHP反序列化,还有对象的构造函数和析构函数,算是Web安全入门题,有兴趣和想法的小伙伴,可以在知乎平台购买Web安全三册,比京东便宜一点,本着助人为乐的精神,就帮助这位小兄弟分析一下~

  • 首先是创建一个Test对象
  • 然后序列化
  • 紧接着echo输出:O:4:"test":1:{s:1:"a";s:4:"test";} (序列化)
  • 接下来是接受一个str参数(GET请求)
  • 再之后反序列化
  • 结束调用析构函数

我们可以先看看这个序列化:O:4:"test":1:{s:1:"a";s:4:"test";}

  • O:4是对象名称长度是4 (test)
  • 1是 对象有1个属性
  • s:1 表示字符长度是1(属性是a)
  • s:4 标识字符长度是4(属性a的值是test)

e18b2ef439544291df1b6c2f961caf02.png

这里的核心是Test对象里面的方法

  • __wakeup:咱们要绕过这个反序列化触发的方法,后面分析
  • __construct:构造函数,这时候变量a=test
  • __destruct:析构方法,如果变量a=flag,咱们就成功了

5292c99ef399cd0fec0d0842b1c8f870.png

当我们请求这个网址的时候,由于反序列化,先调用__wakeup方法,导致变量a=NOflag,那么最后析构的时候,由于不满足a=flag,导致我们拿不到结果~

那么我们的思路就是如何构造请求参数str,让这个变量a=flag,这里我们首先破坏__wakeup方法的执行,然后将实例化时候的test参数,改成flag即可~

我们自己可以构造这样的序列化来获取flag:O:4:"test":2:{s:1:"a";s:4:"flag";}

  • O:4是对象名称长度是4 (test)
  • 2是 对象有2个属性(改变了属性真实个数,破坏了反序列化时__wakeup方法调用)
  • s:1 表示字符长度是1(属性是a)
  • s:4 标识字符长度是4(属性a的值是flag)

这里有一点绕的是,对象是test,然后参数也是test,可能刚刚上大学的小朋友,有点搞不清楚,多看看书,多看看博客,你看的比别人多,你就比别人厉害,信息安全就是信息差~

374e1b9faf086ea9d1c3f90532299597.png

Web安全入门其实很简单,就是要不停的学习,不停的记特性,不停的折腾,总有一天,你会发现,别人都喊你大神,大佬,光头强的时候,你就会突然明白,原来信息安全真的很简单~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ailx10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值