先上源码
<?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后面的"闭合形成一个正常的序列化。
这样我们就能正常的反序列化了,原理的化要多动手试试。