php 序列化的字母标识

您所在的位置:网站首页 序列号F4G开头的是什么 php 序列化的字母标识

php 序列化的字母标识

2023-11-03 04:17| 来源: 网络整理| 查看: 265

ctf比赛中经常出现php反序列化的题,所以写一篇博客来记一下php序列化中的字符标识,可能以后会有补充

a:array 数组 php > echo serialize(array()); a:0:{} php > echo serialize(array(1,2)); a:2:{i:0;i:1;i:1;i:2;} i:integer 整数 php > echo serialize(14); i:14; b:boolean bool值 php > echo serialize(true); b:1; d:double 小数 php > echo serialize(1.1); d:1.1; O:class 对象 php > class a{} php > echo serialize(new a()); O:1:"a":0:{} //解释一下,O表示对象,1表示对象名的字符串长度,'a'是对象名,0是对象内属性个数 s:string 字符串 php > echo serialize('a'); s:1:"a"; N:null NULL值 php > echo serialize(NULL); N; r:reference 对象引用 输出O:11:"SampleClass":2:{s:5:"value";O:12:"SampleClass1":0:{}s:4:"test";r:2;} r: number 的大小: O:11:"SampleClass" 表示 1 s:5:"value" 表示 2 r:2表示 s:5:"value" 的引用 注意,值的引用,也就是值的标识符中有R或r,则不计数,如果后面还有属性 比如 O:11:"SampleClass":2:{s:5:"value";O:12:"SampleClass1":0:{}s:4:"test";r:2;s:6:"value1";s:1:"a"} s:6:"value1" 代表 3 R和r同理 R:pointer reference

利用R我们可以在反序列化的时候,将两个属性的值关联起来,是的两个属性值反序列化之后一直相同

以上输出结果表明第二次序列化不改变引用的关系

C:custom object 自定义对象序列化

php有一个接口 Serializable,有两个方法serialize()和unserialize(),在序列化的时候,按照用户自定义方法序列化 c的格式如下

C::""::{}

其中 表示类名 的长度, 表示自定义序列化数据 的长度,而自定义的序列化数据 是完全的用户自己定义的格式,与 PHP 序列化格式可以完全无关,这部分数据由用户自己实现的序列化和反序列化接口方法来管理。 例子

class MyClass implements Serializable { public $member; function MyClass() { $this->member = 'member value'; } public function serialize() { return ($this->member); } public function unserialize($data) { $this->member = ($data); } } $a = new MyClass(); echo serialize($a); echo "\n"; print_r(unserialize(serialize($a))); // C:7:"MyClass":12:{member value} MyClass Object ( [member] => member value ) S:encoded string

可以将16进制编码成字符,可以进行绕过特定字符



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3