字符串逃逸(闭合)是一种在反序列化函数可控的情况下,通过修改序列化字符串中的敏感字符来达到字符串逃逸的方法。具体而言,可以通过修改变量名等个数,使得序列化字符串中的字符个数与实际变量值个数不一致。由于反序列化机制要求字符串长度必须满足一定条件,因此可以通过构造增加或减少字符的方式来实现字符串逃逸。这种方法可以分为两种情况:1. 序列化字符串变长增加;2. 序列化字符串变短减少。
原理:是在序列化字符串之后追加任意字符串,这样不会影响反序列化的进行。通过修改序列化字符串中的敏感字符,可以绕过一些安全检查和限制,从而实现字符串逃逸。
正常序列化
<?php
$a[]='ping';
$b = serialize($a);
print_r($b);
// 输出:a:1:{i:0;s:4:"ping";}
?>
反序列化示例
<?php
// 正常序列化
//$a[]='ping';
//$b = serialize($a);
//print_r($b);
// 输出:a:1:{i:0;s:4:"ping";}
//$str ='a:1:{i:0;s:4:"ping";}'; // a[]=ping
//$str ='a:1:{i:0;s:4:"ping";}";}123'; // a[]=ping
//$str