PHP反序列化
简述
序列化是将对象保存为可保持或可传输的格式的过程(其实我觉得对象的内存dump下来也可以保存,但是传输的过程中会不会造成信息的失真,或者说传输的数据大小是否会变大,这个需要进行试验分析。)反序列化是与其相对的一个概念,它将数据流(其实每次输入我总感觉是一个json的字符串当然说其为数据流也没问题。)转换为对象。
作用
若反序列化的参数可控,则可以构造任意变量。若代码中有一个类则可以构造此类的对象。
反序列化格式
类型:d ->d代表一个整型数字
O:d -> 对象 ->d代表该对象类型的长度,例如上述的azhe类对象长度为4,原生类对象Error长度为5
a:d -> 数组 ->d代表数组内部元素数量,例如array('a'=>'b','x'=>1)有两个元素
s:d -> 字符串 -dN代表字符串长度,例如abc序列化后为s:3:"abc";
i:d -> 整型 ->d代表整型变量的值,例如300序列化后的值则为i:300;
a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string
例子
1 <?php
2 class test{
3 private $test1="hello";
4 public $test2="hello";
5 protected $test3="hello";
6 }
7 $test = new test();
8 echo serialize($test); // O:4:"test":3:{s:11:" test test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";}
9 ?>
通过对网页抓取输出是这样的 O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}
当序列化字符串设定的类的成员属性个数大于实际个数的时候,会绕过wakeup函数。
常见魔术方法
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发——对象调用一个没有声明的方法时,触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发 echo 对象; $text=$test+$对象;
__invoke() //当脚本尝试将对象调用为函数时触发
例子
后续遇到了再补充吧,最近对在学习渗透相关的内容。
文章评论