返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >CTF-PHP反序列化漏洞1-基础知识
  • 579
分享到

CTF-PHP反序列化漏洞1-基础知识

php开发语言CTFphp反序列化web安全 2023-09-05 18:09:37 579人浏览 安东尼
摘要

作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络

作者:Eason_LYC
悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。
一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有!
技术领域:WEB安全网络攻防
关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半功倍,少走弯路!
个人社区:极乐世界-技术至上
追求技术至上,这是我们理想中的极乐世界~(关注我即可加入社区)

本专栏CTF基础入门系列打破以往CTF速成或就题论题模式。采用系统讲解基础知识+入门题目练习+真题讲解方式。让刚接触CTF的读者真正掌握CTF中各类型知识点,为后续自学或快速刷题备赛,打下坚实的基础~

目前ctf比赛,一般选择PHP作为首选语言,如读者不了解php的基本语法,请登录相关网站自学下基本语法即可,一般5-7天即可掌握基础。

目录

1. 什么是PHP序列化和反序列化

1.1 基础概念

  • PHP序列化是将一个PHP对象转换成一个字符串,以便在不同的应用程序之间传递和存储。
  • 反序列化是将序列化的字符串转换回PHP对象。攻击者可以通过构造恶意的序列化字符串来触发代码执行,这就是PHP反序列化漏洞的本质。
  • PHP序列化函数官方文档:https://www.php.net/manual/en/function.serialize.php
  • PHP反序列化函数官方文档:Https://www.php.net/manual/en/function.unserialize.php

1.2 基础知识

序列化是将 PHP 对象转换为可存储或传输的字符串的过程。序列化后的字符串可以保存到文件或通过网络传输到其他计算机,在需要时可以反序列化为原始对象。

序列化的基本原理是将 PHP 对象转换为一组字符串,其中包含对象的属性和变量。序列化后的字符串可以被反序列化为原始对象,从而重新创建对象。

PHP 序列化可以使用 PHP 内置的 serialize() 函数进行。例如,以下代码将一个 PHP 对象序列化为字符串:

$object = new MyClass();$string = serialize($object);

在上面的代码中,$object 是一个 MyClass 类的实例,serialize() 函数将其序列化为一个字符串,存储在 $string 变量中。

反序列化可以使用 PHP 内置的 unserialize() 函数进行。例如,以下代码将一个序列化的字符串反序列化为 PHP 对象:

$string = 'O:7:"MyClass":2:{s:3:"foo";s:3:"bar";s:3:"baz";i:123;}';$object = unserialize($string);

在上面的代码中,$string 是一个序列化的字符串,unserialize() 函数将其反序列化为一个 MyClass 类的实例,存储在 $object 变量中。

需要注意的是,PHP 序列化只能序列化 PHP 对象,不能序列化资源、闭包等其他类型的数据。另外,由于序列化后的字符串包含对象的私有属性和方法,因此在反序列化时需要确保对象的类定义已经加载到内存中。

简单来说,就是将一个php对象转化为字符串保存(序列化),方便传输到远端后,在远端再还原成对象的一个过程(反序列化)。

1.3 PHP反序列化漏洞的危害

PHP反序列化漏洞可以导致远程代码执行,攻击者可以通过构造恶意的序列化字符串,将任意代码注入到应用程序中,从而实现控制服务器的目的。

简单说就是构造恶意的字符串(序列化),这样远端还原对象时(反序列化),就把恶意的对象还原并执行了。

1.4 PHP反序列化漏洞的防御措施

防御PHP反序列化漏洞的方法有多种,其中最重要的是对用户输入进行过滤和验证。此外,还可以使用PHP内置的序列化函数进行序列化和反序列化,而不是使用第三方库。

2. 知识点讲解

首先我们先看一个完整的PHP序列化和反序列化的代码

CTF中往往会直接给出代码,需要分析代码编制恶意字符串

请添加图片描述

2.1 类的访问修饰符

上图中定义了一个类Tree,类中前三行分别出现了public、private、protected,分别是什么意思呢?下面我们就来详细介绍下~·

  • 类内部:是指类定义的内部,即类名后大括号{ }内部。
  • 类外部:是指类定义的外部内容,即类名后大括号{}之外的所有地方。
  • 类成员的访问权限控制分为:内部访问(私有的private)。内部访问(受保护protected)和全部访问(公有public)。

2.1.1 public 公开的

公开的属性或函数,可在类内部、外部访问
public $name='BMW'
public function XXX{}

2.1.2 protected 受保护的

受保护的属性或函数,只能在类及其子类、父类间内部访问。若想在外部访问,需要设置引用方法。
protected $color='blue'

2.1.3 private 私有的

私有的属性或函数,只能在当前类的内部访问,若想在外部访问,需要设置引用方法。

比如上图中最后三个echo的调用,如下图可以看到,public可以正常调用,其余两个产生报错

在这里插入图片描述

2.2. 相关函数和重要知识点

2.2.1 基础定义

序列化的目的是方便对象的传输和存储。

  • 序列化

指将一个实例化的对象从一个实例转换为一个简短的序列化字符串,这样便于保存对象,可以将序列化字节存储到数据库或者文本当中。

  • 反序列化

是当需要的时候再通过反序列化将序列化字符串解析,获取保存的对象,直接调用,而不需要重新实例化一个类

在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等

2.2.2 相关函数及技巧知识点

serialize(mixed $value)

参数为需要序列化的对象、数组、字符串等。返回值类型为字符串,即序列化字符串。

unserialize(string $str): mixed

参数类型为字符串,也就是序列化字符串。返回值为反序列化得到的对象、数组、字符串等。

class Car{public $name='BMW';protected $color='blue';private $size='large';private $price;function __construct(){echo '序列化时调用构造方法
'
;}function __destruct(){echo '反序列化时调用析构函数
'
;}function show(){echo $this->name.'
'
;echo $this->color.'
'
;echo $this->size.'
'
;echo 'price:"'.$this->price.'"
'
;}}$myCar = new Car();$o = serialize($myCar);print_r($o);print_r("\n");print_r(urlencode($o));print_r("\n");$un_o = unserialize(urlencode($o));print_r($un_o);?> // 序列化时调用构造方法// O:3:"Car":4:{s:4:"name";s:3:"BMW";s:8:"*color";s:4:"blue";s:9:"Carsize";s:5:"large";s:10:"Carprice";N;}// O%3A3%3A%22Car%22%3A4%3A%7Bs%3A4%3A%22name%22%3Bs%3A3%3A%22BMW%22%3Bs%3A8%3A%22%00%2A%00color%22%3Bs%3A4%3A%22blue%22%3Bs%3A9%3A%22%00Car%00size%22%3Bs%3A5%3A%22large%22%3Bs%3A10%3A%22%00Car%00price%22%3BN%3B%7D // 反序列化时调用析构函数

这段代码定义了一个名为Car的类,包含公共属性$name、受保护属性$color、私有属性$size和未定义初始值的私有属性$price,以及构造函数__construct()析构函数__destruct()和一个公共方法show(),用于输出属性的值。

在代码中,首先创建了一个Car类的实例$myCar,并将其序列化为字符串$o,然后打印输出$o和$o的URL编码形式。

$o=O:3:"Car":4:{s:4:"name";s:3:"BMW";s:8:"*color";s:4:"blue";s:9:"Carsize";s:5:"large";s:10:"Carprice";N;}urlencode($o) = O%3A3%3A%22Car%22%3A4%3A%7Bs%3A4%3A%22name%22%3Bs%3A3%3A%22BMW%22%3Bs%3A8%3A%22%00%2A%00color%22%3Bs%3A4%3A%22blue%22%3Bs%3A9%3A%22%00Car%00size%22%3Bs%3A5%3A%22large%22%3Bs%3A10%3A%22%00Car%00price%22%3BN%3B%7D

接着,将URL编码后的字符串$o反序列化为一个新的对象$un_o,并打印输出$un_o。

在输出的过程中,构造函数__construct()被调用,输出序列化时调用构造方法,而析构函数__destruct()在反序列化时被调用,输出反序列化时调用析构函数。在调用show()方法时,只有公共属性$name和受保护属性$color被输出,而私有属性$size的值无法输出。

PHP序列化字符串的格式如下:
对象类型:长度:“类名”:类中变量的个数:{类型:长度:“值”;类型:长度:“值”;......}

这里的长度是指字符串长度 o表示对象,a表示数组,s表示字符,i表示数字

2.2.3 【技巧】urlencode 序列化结果

  • %00为空字符,占位1位。正常浏览器不会显示,但是在urlencode下会显示
  • private在序列化后会出现%00*%00(%00*%00color)
  • protected在序列化后出现 %00类名%00变量名(%00Car%00size)

为避免浏览器不显示空字段,导致反序列化不成功,使用序列化时采用url编码
$o = urlencode(serialize($myCar))
在这里插入图片描述

2.2.4 【技巧】序列化引用R类型绕过比对

序列化的时候可以通R类型值来保存变量的引⽤(指针)状态。

在这里插入图片描述

上述含义为:input值引用correct值的结果。保持key[correct] = key[input]

2.2.5 PHP反序列化特点

PHP在序列化保存类对象状态时,只保存其中的变量和类名等,并不会保存序列化时类的结构(不保存方法)。在反序列化时其实就是将序列化字符串中存储的变量,带入到当前上下文环境中寻找到的类,去重新实例化对象。

3. PHP常用魔术方法

3.1 魔法函数汇总

面向对象编程中,PHP 提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利,在 PHP 中的作用是非常重要的。PHP 中的魔术方法通常以__(两个下划线)开始,并且不需要显式的调用而是在某种特定条件下自动调用的。上文中介绍的构造函数 __construct() 在实例化对象时调用,析构函数__destruct()在销毁对象时自动调用。常用魔术方法如下:

__construct()  // 构造函数,在实例化对象时调用__destruct()   // 析构函数,在销毁对象时调用__call(string $function_name, array $arguments)  // 在对象中调用一个不可访问或不存在的方法时被调用__callStatic() // 用静态方式中调用一个不可访问方法时调用__get($name)   // 获取对象不存在的属性或无法访问的属性时调用.$name表示要获取的属性名__set($name, $value) // 设置对象不存在的属性或无法访问的属性时调用.$name表示要设置的属性名,$value表示要设置的值__isset()     // 当对不可访问属性调用isset()或empty()时调用__unset()     // 当对不可访问属性调用unset()时被调用__sleep()     // 执行serialize()时,先会调用这个函数__wakeup()    // 执行unserialize()时,先会调用这个函数__toString()  // 类被当成字符串时的回应方法  echo $obj;__invoke()    // 以调用函数的方式调用一个对象时的回应方法  $person();__set_state() // 调用var_export()导出类时,此静态方法会被调用__clone()     // 当对象复制完成时调用__autoload()  // 尝试加载未定义的类__debugInfo() // 打印所需调试信息

反序列化时会默认调用的方法有:

  • __destruct()
  • __wakeup()

魔法函数介绍推荐文章:
PHP之十六个魔术方法详细介绍
PHP魔法方法/函数详解

3.2 魔法函数使用示例

下面这段代码,初学时也许看不明白,但其实含金量非常高,后续做题中,这个表要反复查看的~

# 设置⼀个类Aclass A{ private $name = "AS1def"; function __construct() { echo "__construct() call\n"; } function __destruct() { echo "\n__destruct() call\n"; } function __toString() { return "__toString() call\n"; } function __sleep() { echo "__sleep() call\n"; return array("name"); } function __wakeup() { echo "__wakeup() call\n"; } function __get($a) { echo "__get() call\n"; return $this->name; } function __set($property, $value) { echo "\n__set() call\n"; $this->$property = $value; } function __invoke() { echo "__invoke() call\n"; }}//调⽤ __construct()$a = new A();//调⽤ __toSting()echo $a;//调⽤ __sleep()$b = serialize($a);echo $b;//调⽤ __wakeup()$c = unserialize($b);echo $c;//不存在这个abcd属性,调⽤ __get()echo $a->abcd;//name是私有变量,不允许修改,调⽤ __set()$a->name = "pro";echo $a->name;//将对象作为函数,调⽤ __invoke()$a();//程序结束,调⽤ __destruct() (会调⽤两次__destruct,因为中间有⼀次反序列化)

输出结果如下:

__construct() call__toString() call__sleep() callO:1:"A":1:{s:7:"Aname";s:6:"AS1def";}__wakeup() call__toString() call__get() callAS1def__set() call__get() callpro__invoke() call__destruct() call__destruct() call

以上就是PHP反序列化的基础知识,下一篇文章就在这些基础知识上,开始题目的练习~

来源地址:https://blog.csdn.net/eason612/article/details/130050983

--结束END--

本文标题: CTF-PHP反序列化漏洞1-基础知识

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

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

猜你喜欢
  • CTF-PHP反序列化漏洞1-基础知识
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-09-05
    php 开发语言 CTF php反序列化 web安全
  • PHP反序列化漏洞基础概要
    目录 什么是反序列化漏洞? 序列化 serialize 反序列化 unserialize 常见魔法函数 反序列化漏洞防御 什么是反序列化漏洞? 反序列化又叫对象注入,漏洞产生是程序在处理对象、魔术函数以及序列化问...
    99+
    2023-09-06
    php 开发语言 安全
  • CTF-PHP反序列化漏洞3-构造POP链
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-10-09
    php 开发语言 web安全 反序列化漏洞 pop链
  • 反序列化漏洞(PHP)
    反序列化漏洞 0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更...
    99+
    2023-09-03
    php web安全 安全
  • PHP 反序列化漏洞
    PHP反序列化漏洞在实际测试中出现的频率并不高,主要常出现在CTF中。 PHP序列化概述 PHP序列化函数: serialize:将PHP的数据,数组,对象等序列化为字符串unserialize:将序列化后的字符串反序列化为数据,数组,对...
    99+
    2023-09-01
    php web安全
  • 【反序列化漏洞-02】PHP反序列化漏洞实验详解
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-21
    序列化 反序列化 PHP反序列化漏洞 PHP魔术方法 网络安全 Powered by 金山文档
  • CTF-PHP反序列化
    CTFSHOW-关卡254到258-原生类&POP构造 CTF-254-对象引用执行逻辑 username=xxxxxx&password=xxxxxx 解题思路:触发vipOneKeyGetFlag这个方法,同时让方法中的判断为真才能获...
    99+
    2023-09-22
    php java 开发语言
  • thinkphp 反序列化漏洞
    文章目录 配置xdebug反序列化漏洞利用链详细分析poc1(任意文件删除)poc2(任意命令执行) 补充代码 配置xdebug php.ini [Xdebug]zend_ext...
    99+
    2023-09-04
    apache php 开发语言 web安全 网络安全
  • php反序列化漏洞之pop链
    目录 POP链简介 pop面向属性编程: pop chain pop链利用技巧 1、在pop链中出现的方法: 2、反序列化中为了避免信息丢失,可以使用大写S,支持字符串的编码 3、深浅copy 4、利用php伪协议 POP键构造复现: 例...
    99+
    2023-09-29
    安全 web安全
  • CTF必看~ PHP反序列化漏洞6:绝妙_wakeup绕过技巧
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-09-06
    开发语言 php反序列化 ctf web安全
  • 【反序列化漏洞-01】序列化与反序列化概述
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-06
    web安全 安全 反序列化 序列化 PHP反序列化漏洞 Powered by 金山文档
  • 反序列化漏洞详解
    目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用  八、反序列化漏洞的利用 1._...
    99+
    2023-09-02
    web安全 安全 php
  • PHP反序列化漏洞实例分析
    本篇内容介绍了“PHP反序列化漏洞实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、PHP面向对象编程在面向对象的程序设计(Obje...
    99+
    2023-06-29
  • PHP反序列化漏洞怎么修复
    修复PHP反序列化漏洞可以采取以下措施: 检查并过滤用户输入:在反序列化之前,对用户输入进行严格的过滤和检查,只允许特定的类型和...
    99+
    2023-10-22
    PHP
  • PHP的session反序列化漏洞分析
    这篇文章主要讲解了“PHP的session反序列化漏洞分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP的session反序列化漏洞分析”吧!PHP session反序列化漏洞PHP ...
    99+
    2023-06-30
  • CTF php反序列化总结
    前言:本⼈⽔平不⾼,只能做⼀些类似收集总结这样的⼯作,本篇文章是我自己在学php反序列化写的一篇姿势收集与总结,有不对的地方欢迎师傅们批评指正~ php反序列化 定义:序列化就是将对象转换成字符串。反...
    99+
    2023-08-31
    php web安全 网络安全
  • phpmyadmin scripts/setup.php 反序列化漏洞
    文章目录 0x01 影响版本 0x02 漏洞复现 0x03 补充知识点: ...
    99+
    2023-09-03
    php 开发语言 linux
  • thinkphp5.0.24反序列化漏洞分析
    thinkphp5.0.24反序列化漏洞分析 文章目录 thinkphp5.0.24反序列化漏洞分析 具体分析 反序列化起点 toArray ge...
    99+
    2023-09-03
    安全 php web安全 数据库 开发语言
  • 浅谈phar反序列化漏洞
    目录 基础知识 前言 Phar基础 Phar文件结构 受影响的函数 漏洞实验 实验一 实验二 过滤绕过 补充 基础知识 前言 PHP反序列化常见的是使用unserilize()进行反序列化,除此之外还有其它的反序列化方法,不需要用到un...
    99+
    2023-09-09
    web安全 网络安全 php
  • php魔术方法和反序列化漏洞
    什么是反序列化漏洞? 漏洞形成的根本原因就是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、GetShell 等一系列不可控的后果。反序列化漏洞并不是...
    99+
    2023-09-10
    php android 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作