简述
前端时间复现 drupal Remote Code Execution- SA-CORE-2019-003 遇到了php反序列化的问题,打算这篇文章写一下php反序列化。
首先我们简单介绍一下php序列化的数据
a - array 数组
b - boolean 布尔
d - double 浮点数
i - integer 数字
o - common object PHP3 中被引入用来序列化对象
r - reference 对象引用
s - non-escaped binary string
S - escaped binary string
C - custom object 自定义的对象序列化
O - class 序列化对象 PHP4 取代o
N - null
R - pointer reference 指针引用
U - unicode string PHP6 引入unicode编码字符串
接下来重点用代码分析序列化数据
class SampleClass {
var $value;
}
$a = new SampleClass();
$a->value = $a; //对象引用
$b = new SampleClass();
$b->value = &$b; //指针引用
var_dump(serialize($a));
var_dump(serialize($b));
$a->value = 1; //不会更改本身对象
$b->value = 1; //会改变本身对象
var_dump(serialize($a));
var_dump(serialize($b));
上述代码分析了对象引用与指针引用的情况以及区别,序列化数据为
O:11:"SampleClass":1:{s:5:"value";r:1;}
O:11:"SampleClass":1:{s:5:"value";R:1;}
O:11:"SampleClass":1:{s:5:"value";i:1;}
i:1;
php中对于protected和private属性序列化时具有特定的形式,以下还是用代码表示
class demo{
protected $protected = 1;
private $private = 2;
}
$c = new demo;
var_dump(serialize($c));
$s = "O:4:"demo":1:{s:1:"s";N;}";
var_dump(unserialize($s));
$f = "O:4:"demo":2:{s:12:" 0* 0protected";i:2;s:13:" 0demo 0private";N;}";
var_dump(unserialize($f));
对于protected属性的变量序列化时前面会加 0* 0,protected属性的变量序列化为 0类名
评论