[安洵杯 2019]easy_serialize_php

时间:2020-04-11
本文章向大家介绍[安洵杯 2019]easy_serialize_php,主要包括[安洵杯 2019]easy_serialize_php使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

考点:反序列化逃逸

进去后给了源码:

看到可以传phpinfo,还说可以找到东西,那么传一下试试:

往下翻,找到了d0g3_f1ag.php:

访问,页面存在。看来这就是flag页面了。回头来看下源码,分析请看注释:

<?php

$function = @$_GET['f']; //接受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,会释放,重新生成
}

//function我们是可控的
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

extract($_POST);//!!数组中将变量导入到当前的符号表。
//比如post:a=b --->$a=b
//类似于可变变量的变量覆盖,这个地方我们可以指定某个变量为我们想要的值

if(!$function){
    echo '<a href="index.php?f=highlight_file">source_code</a>';//字面意思
}

//绕过重点
if(!$_GET['img_path']){  //如果没有img_path GET参
    $_SESSION['img'] = base64_encode('guest_img.png'); //base64编码存入session
}else{ //指定了参数
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path'])); //base64+sha1存入session
}

$serialize_info = filter(serialize($_SESSION));//!!会吧传入的session序列化,并且过一遍过滤函数

if($function == 'highlight_file'){//1
    highlight_file('index.php');
}else if($function == 'phpinfo'){//2
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){//3!!如果传入f=这个,
    //会将反序列化后的结果中的img标签,base64并输出
    $userinfo = unserialize($serialize_info);
    echo file_get_contents(base64_decode($userinfo['img']));
}

通过传img_path来读session显示是8可能的,因为sha1(base64_encode)想要爆破出来估计是下辈子……

所以只能通过变量覆盖(extract)+反序列化这一条路,我们来理一下逻辑:

POST:$_SESSION=

$flag 上一页 下一页

上一篇:JavaScript数组简介

下一篇:map和reduce