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