攻防世界——web——unserialize3(反序列化)

一、序列化

将对象的状态信息转换为可以存储或传输的形式的过程,简单来说,就是将对象转化为字节序列的过程

二、反序列

把字节序列恢复为对象的过程称为对象反序列

4代表"test"占4个字符长度,2代表着对象具有两个变量:name和age,s代表string,字符型(如果为i,代表int型)

首先进入看到这段代码,我们分析一下

  1. class是创建一个类,public是公有的意思,private是私有。公有的类的外部函数都可以访问他,私有的只有类内部的函数可以访问。
  2. 我们创建了一个xctf的类,这个类有一个属性叫做flag,还有一个方法。就相当于创建一个man的类,给他创建身高、体重的属性。
  3. 方法其实就可以看成是函数的定义
  4. 外部如果是unserialize()则会直接调用wakeup()方法,并且输出bad requests。我们不希望他退出,所以要想办法构造url绕过wakeup()
  5. 将定义的类序列化字符串传入code
<?php
class xctf{
    public $flag = '111';
    public function __wakeup(){
    exit('bad requests');
    }
}
    $b=new xctf();
    $a=serialize($b);
    echo $a;
?>

得到序列化后的字符串为

可以知道传入的code会被unserialize反序列化

  1. 当序列化字符串中属性个数大于实际属性个数时,不会执行反序列化,从而跳过wakeup()
  2. 原本:O:4:"xctf":1:{s:4:"flag";s:3:"111";} 改为:O:4:"xctf":3:{s:4:"flag";s:3:"111";}
  3. 这段反序列的意思是xctf占4个字符,有一个属性值flag,flag占4个字符,111占三个字符。flag=111

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值