泷羽Sec-分享网络安全 | 安全产品测评 | 网站建设 - 反序列化
type: channel
link: https://longyusec.com/tag/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/
items: PHP反序列化漏洞从入门到深入8k图文介绍，以及phar伪协议的利用

PHP反序列化漏洞从入门到深入8k图文介绍，以及phar伪协议的利用
type: item
date: 2025-05-18T18:32:24+08:00
description: 前言本文内容主要分为三个部分：原理详解、漏洞练习和防御方法。这是一篇针对PHP反序列化入门者的手把手教学文章，特别适合刚接触PHP反序列化的师傅们。本文的特色在于对PHP反序列化原理进行了深入细致的分析，并提供了一系列由简入深的PHP反序列化习题，配以详细的练习和分析讲解。序列化介绍序列化是指将变量转换为一种可保存或传输的字符串形式的过程；而反序列化则是在需要的时候，将这个字符串重新转换回原来的变量形式以供使用。这两个过程相辅相成，为数据的存储和传输提供了极大的便利，同时也使得程序更加易于维护和扩展。例子将一大段对象序列化压缩成字符串.然后根据要求反序列化重新构造对象.(②是序列化的格式,下文详解)class Person { public $name; //public 修饰的这个成员在任何地方都可以使用 private $age; //private 修饰的成员只能被 其所在类 的其他成员访问 protected $sex; //protected 修饰的类成员 所在类的子类以及同一个包内的其他类 访问 function sayName() { echo $this->name; } function sayAge() { echo $this->age; } function saySex() { echo $this->sex; } function __construct($name, $age,$sex) { $this->name = $name; $this->age = $age; $this->sex = $sex;//protected修饰的sex } } $person=new Person('张三',20,'boy'); $person->sayName();//张三 $person->sayAge();//20 $person->saySex();//boy echo ' '; // 序列化：serialize将php的遍历变量（数组、对象等）转化成一个 可以存储或传输的字符串 表示的函数。即---对象压缩成字符串 echo serialize($person);//O:6:"Person":3:{s:4:"name";s:6:"张三";s:11:"Personage";i:20;s:6:"*sex";s:3:"boy";} echo " "; // 因为我们需要使用url进行测试，所以将这个转化后的字符串进行url编码，便于之后进行反序列化测试 echo urlencode(serialize($person));//O%3A6%3A%22Person%22%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A6%3A%22%E5%BC%A0%E4%B8%89%22%3Bs%3A11%3A%22%00Person%00age%22%3Bi%3A20%3Bs%3A6%3A%22%00%2A%00sex%22%3Bs%3A3%3A%22boy%22%3B%7D get.php进行反序列化，将上面进行url编码的内容传到这个php，进行反序列化（将字符串还原成对象）<?php $html =unserialize($_GET['html']); echo $html; 在上面的代码中我们可以看到序列化之后的内容为，将其进行分段详细解析O:6:"Person":3:{s:4:"name";s:6:"张三";s:11:"Personage";i:20;s:6:"*sex";s:3:"boy";} O : 自定义对象 object 6 : 类名的长度 :3 : 3个成员属性 s:4 : 你的成员属性名 长度为4 ,并且是一个字符串 string s:3 : 刚刚那个成员属性对应的值 是string类型,并且长度是3位 s:11:"Personage" : 因为该属性是私有属性,所以需要在属性名前加上类名,方便我们进行反序列化的时候的识别. i:20 : 20是age的属性值 , i是代表 integer类型 s:6:"*sex"; sex这个属性是一个受保护的属性,特征就是 * 号 s:3:"boy : 代表 string类型,属性值长度为3位 boy对应是 sex的属性值 private和 protected详解//protected举例 class Animal { protected $name; //构造函数，即当你创建一个新对象时，这个方法会自动被调用，用于被初始化对象。 //构造函数可以接收参数，这些参数可以用来设置对象的初始状态。 public function __construct($name) { $this->name = $name; } protected funct…