反序列化字符串逃逸(字符变少)

先上源码

<?php
function change($str){
    return str_replace("xx","x",$str);
}
$a=$_GET['a'];
$b=$_GET['b'];
class ddd{
    public $a;
    public $b;
    public function __construct($d,$f)
    {
        $this->a=$d;
        $this->b=$f;
    }

}
$dd=new ddd($a,$b);
$q=serialize($dd);
echo '过滤前'.$q ;
echo "<br>";
echo '过滤后:'.change(serialize($dd));
$c= change(serialize($dd));
echo "<br>";
print_r( unserialize($c));
?>

先来看一下正常序列化。
反序列化字符串逃逸(字符变少)我们把b的序列的复制下来";s:1:“b”;s:5:“admin”;},这里从“开始是因为正好可以跟前面的”闭合后面会说到。
我们再来看看过滤后的序列化。
反序列化字符串逃逸(字符变少)
红框框这里明显少了很多xx,这里就不符合序列化逻辑,过滤后由于少了23个xx所以他会吃掉后面23个字符。
反序列化字符串逃逸(字符变少)
第一部分是原来的23个字符,第二部分是被吃掉的字符串,我们可以看到他会吃掉我们输入的";s:1:",很显然更不符合序列化逻辑,这个时候我们可以在";s:1:“b”;s:5:“admin”;}前面多加几个字符串从而避免被吃掉。
反序列化字符串逃逸(字符变少)
可以看到添加完字符串,蓝色部分正好是46位且后面的"刚好跟46后面的"闭合形成一个正常的序列化。
反序列化字符串逃逸(字符变少)

这样我们就能正常的反序列化了,原理的化要多动手试试。

上一篇:php魔术方法之__serialize、__unserialize


下一篇:【微信小程序---px,rpx,屏幕变化的换算】