5-字符串逃逸

字符串减少

反序列化分隔符
反序列化以;}结束,后面的字符串不影响正常的反序列化
属性逃逸
一般在数据先经过一次serialize再经过unserialize,
在这个中间反序列化的字符串变多或者变少的时候有可能存在反序列化属性逃逸。

image.png
这样是反序列不了 , 成员属性 不对 $b成员属性是两个
所以要改成
image.png

image.png

O:1:”A”:1:{s:2:”v1”;s:3:”a”b”;}

是字符还是格式符号 ,是由字符串长度3 来判断的
在前面字符串没有问题的情况下,;}是反序列化结束符,后面的字符串不影响反序列化结果
没有问题指的是三个一致:

成员属性数量一致
成员属性名称长度一致,
内容长度一致

属性逃逸
一般在数据先经过一次serialize再经过unserialize,
在这个中间反序列化的字符串变多或者变少的时候才有可能存在反序列化属性逃逸。
image.png
这里他肯定是不成功的
原本的序列化内容是这样的
O:1:"A":2:{s:2:"v1";s:11:"abcsystem()";s:2:"v2";s:3:"123";}
但是经过
str_replace(“system()”,””,$data);
就是这样的
O:1:"A":2:{s:2:"v1";s:11:"abc";s:2:"v2";s:3:"123";}
长度都不一致了 看到反序列化不了 ,所以会直接flase

思考: 通过修改v2的值 “123”达到逃逸效果
image.png

image.png

image.png

字符串增多

字符串逃逸
反序列化字符串减少逃逸:多逃逸出一个成员属性
第一个字符串减少,吃掉有效代码,在第二个字符串构造代码
反序列化字符串增多逃逸:构造出一个逃逸成员属性
第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸的成员属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class A{
public $v1 = 'ls';
public $v2 = '123';

public function __construct($arga,$argc){
$this->v1 = $arga;
$this->v2 = $argc;
}
}
$data = serialize(new A($a,$b));
$data = str_replace("ls","pwd",$data);

var_dump(unserialize($data));

image.png
str_replace把”ls”替换为”pwd”
字符增多,会把末尾多出来的字符挤出bool(false)
image.png
就会放回bool(false)
image.png
lslslslslslslslslslslslslslslslslslslslslsls";s:2:"v3";s:3:"666";}
image.png
这样就可以逃逸了
第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸成员属性

增多例题:

image.png

减少例题: