前言:
php反序列化字符串逃逸之前没有详细的学习过,所以遇到题目看的有点懵,这次好好学习一下。
反序列化的特点
首先要了解一下反序列化的一些特点:
- php在反序列化时,底层代码是以
;
作为字段的分隔,以}
作为结尾,并且是根据长度判断内容的 ,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化 。
class A{
public $name='shy';
public $pass='123456';
}
$lemon = new A();
echo serialize($lemon);
#反序列化后的结果为:
O:1:"A":2:{
s:4:"name";s:3:"shy";s:4:"pass";s:6:"123456";}
超出的部分并不会被反序列化成功,如下图:
这说明反序列化的过程是有一定识别范围的,在这个范围之外的字符都会被忽略,不影响反序列化的正常进行。而且可以看到反序列化字符串都是以";}
结束的,那如果把";}
添入到需要反序列化的字符串中(除了结尾处),就能让反序列化提前闭合结束,后面的内容就相应的丢弃了。
2. 长度不对应的时候会报错
在反序列化的时候php会根据s所指定的字符长度去读取后边的字符。如果指定的长度错误则反序列化就会失败
3. 可以反序列化类中不存在的元素
<?php
$str='O:1:"A":3:{s:4:"name";s:3:"shy";s:4:"pass";s:6:"123456";s:5:"pass2";s:6:"12345