2024.12.11-13——攻防世界unserialize3

news/2024/12/16 16:18:30/

知识点:PHP中的序列化和反序列化

一、序列化和反序列化

1.序列化(serialize)

将对象的状态信息转换为可以存储或传输的形式的过程,简单来说,就是将状态信息保存为字符串。为了解决不同机器之间传输复杂数据类型的一种机制

2.反序列化(unserialize)

将字符串转换为状态信息。

3.最终目的

实现对象的跨平台存储、网络传输

4.魔术方法

PHP中有一类特殊的方法叫“Magic Function”,即魔术方法,PHP将所有以__(双下划线)开头的类方法保留为魔术方法,主要重点关注

__construct():当对象创建(new)时会自动调用,但在unserialize()时是不会自动调用的(构造函数)
​
__destruct():当对象操作执行完毕后(被销毁)自动执行destruct()函数的代码
​
__wakeup():unserialize()时自动调用
​
__call()方法当调用类实例中不存在的函数时自动执行

5.其他函数

  • var:理解为定义属性一般用在class函数后,表定义xx为xx类的一个属性。

  • var_dump函数:用于输出变量的相关信息,包括类型与值。

  • class函数:定义一个类,并在类中定义属性和方法。

  • public函数:是PHP中访问控制修饰符之一,用于定义类的成员(属性和方法)的可访问级别。类的成员在类的外部可以被访问和修改。

注:在PHP的OOP中,类(Class)是构成面向对象编程的基本单位。类可以包含属性(变量)和方法(函数)。

6.序列化特征值

为了能够对一个类的序列化字符序列进行反序列化,这个对象的类必须已经定义过。

如果序列类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。

以下是常用的序列化得到的字符串所代表的含义:

例如:

二、解题思路

step 1 打开靶场审题

题目为unserialize,即与反序列化有关,看页面,显示出一个不完整的PHP代码——括号都没有完全闭合。

注:这里的 ?code= 为GET传参

step 2 代码审计

_wakeup()为魔术方法,通常用于反序列化中。

unserialize() 反序列化函数会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源,比如连接数据库。

这题到目前的代码是没有看见序列化函数的,所以我们传递参数的时候是需要自己传递已经序列化的参数,题目也给了提示,是传参给code

step 3 补充代码将其序列化

将代码补充完整,将其序列化显示出来

<?php
class xctf{                    
public $flag = '111';            
public function __wakeup(){     
exit('bad requests');
}
}
$a = new xctf();          
echo(serialize($a));       
?>

将其序列化:php代码运行

目前我还没有配置好PHP运行环境,找到了一个在线网站菜鸟教程在线编辑器,可以在线运行php代码。

以上代码运行结果如下:

O:4:"xctf":1:{s:4:"flag";s:3:"111";}
“O”:代表object(为A时代表Array)
“4”:代表"xctf"占4个字符长度
"xctf":对应前面提到的长度为 4 的对象名称,也就是这个被序列化对象的名称是 xctf。
“1”:代表着对象具有一个成员属性:s代表string
{...} :花括号内的内容是具体用来描述对象中成员属性的序列化表示情况,里面包含了具体的属性名和属性值的序列化内容。
​
“s”:表示这是一个字符串(String)类型的数据,在序列化中,每个成员属性如果是字符串类型都会以 s 开头来标识。
“4”:紧跟 s 后的数字表示后面所定义的字符串(这里是属性名)的长度,也就是 flag 这个字符串长度为 4 个字符,代表的是对象的成员属性名称。字符型(如果为i,代表int型)
"flag" :对应前面长度为 4 所指的具体的字符串内容,也就是对象 xctf 里包含的这个成员属性的名称是 flag。
​
后面又出现的
s:3:"111" 同理,先是 s 标识字符串类型,3 表示后面所跟字符串内容的长度为 3 个字符,最后的 "111" 就是该成员属性(名为 flag)具体所存储的字符串值内容,即值为 111。

step 4 构造payload,进行传参

根据代码审计,我们构造出来序列化序列之后,不能给__wakeup()执行,否则会返回bad request参数,所以需要在序列化参数做些修改。

尝试传参

?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}

得到 bad request 信息

step 5 修改payload,得到flag

这里的漏洞就是:如果我们在序列化中说明的对象个数要比实际的对象个数要大,那么将不会执行__wakeup()这个方法,即绕过 _wakeup()

所以,我们将序列化输出的对象个数改成比1大的数就行了比如:

?code=O:4:"xctf":4:{s:4:"flag";s:3:"111";}

即可得到flag。也就是证明,我们的序列化参数真实传递给了$code


http://www.ppmy.cn/news/1555621.html

相关文章

牛客周赛71(字符串,状压dp)

目录 B. 宝石手串 D. 气球谜题 B. 宝石手串 &#xff08;1&#xff09;两种扩容方式&#xff1a; // 法一&#xff1a;直接加&#xff08;通常用于拼接字符串&#xff09;s s// 法二&#xff1a;一个一个字符加&#xff08;用于加单个字符&#xff09;for (…

如何实现一套完整的CI/CD?

CI/CD在项目中的作用不可言喻&#xff0c;避免了手工操作的低级失误以及便捷了开发部署项目。首先实现完整CI/CD&#xff0c;需要一些前置知识。 CI是什么&#xff1f; CI是持续化集成。他主要流程其实就是开发将代码上传到Github&#xff0c;持续集成工具&#xff08;Github …

canvas保存图片

需求&#xff1a;上面有几个按钮&#xff0c;其中有一个切换是图片 用v-if会导致图片加载慢 实现方法&#xff1a; 一进来就加载&#xff0c;通过监听元素显示&#xff0c;用于控制canvas的宽高&#xff0c;从而达到隐藏的效果 组件dowolad.vue <template><view …

Java开发者的神经网络进阶指南:深入探讨交叉熵损失函数

前言 今天来讲一下损失函数——交叉熵函数&#xff0c;什么是损失函数呢&#xff1f;大体就是真实与预测之间的差异&#xff0c;这个交叉熵&#xff08;Cross Entropy&#xff09;是Shannon信息论中一个重要概念&#xff0c;主要用于度量两个概率分布间的差异性信息。在信息论…

从零开始:PHP基础教程系列-第1篇:PHP简介与环境搭建

从零开始&#xff1a;PHP基础教程系列 第1篇&#xff1a;PHP简介与环境搭建 一、PHP简介 PHP&#xff08;全称&#xff1a;PHP: Hypertext Preprocessor&#xff09;是一种广泛使用的开源脚本语言&#xff0c;尤其适合用于Web开发。它可以嵌入HTML中&#xff0c;允许开发者轻…

51单片机-内部扩展RAM的应用

RAM是在程序运行中存放随机变量的数据空间&#xff0c;51单片机球认的内部RAM只有128B&#xff0c;c 清于编程者来说&#xff0c;一个芯片的RAM空间越大&#xff0c;RAM不够用怎么办&#xff0c;连过多的变量都不敢定义。写起程序来就越容易得心应手&#xff0c;不会总考忠压前…

数据挖掘之聚类分析

聚类分析&#xff08;Clustering Analysis&#xff09; 是数据挖掘中的一项重要技术&#xff0c;旨在根据对象间的相似性或差异性&#xff0c;将对象分为若干组&#xff08;簇&#xff09;。同一簇内的对象相似性较高&#xff0c;而不同簇间的对象差异性较大。聚类分析广泛应用…

SpringCloud微服务实战系列:03spring-cloud-gateway业务网关灰度发布

目录 spring-cloud-gateway 和zuul spring webflux 和 spring mvc spring-cloud-gateway 的两种模式 spring-cloud-gateway server 模式下配置说明 grayLb://system-server 灰度发布代码实现 spring-cloud-gateway 和zuul zuul 是spring全家桶的第一代网关组件&#x…