php反序列化

php反序列化原理及注入基础。

序列化是对象串行化,对象是一种在内存中存储的数据类型,寿命是随生成该对象的程序的终止而终止,为了持久使用对象的状态,将其通过serialize()函数进行序列化为一行字符串保存为文件,使用时再用unserialize()反序列化为对象。

序列化举例

数组:
a:<length>:{key, value pairs};
a:1:{i:1;s:1:"a";}
对象:
O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>};
O:6:"person":3:{s:4:"name";N;s:3:"age";i:19;s:3:"sex";N;}

这部分内容适宜搭建合适的php运行和调试环境学习:

环境推荐:小皮面板+sublimetext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!-- 
//序列化:将PHP对象压缩并按照一定格式转换成字符串的过程
//反序列化:从字符串转换回PHP对象的过程

//目的:为了方便PHP对象的传输和存储 -->
<?php
class test
{
private $flag = 'Inactive';
protected $test = "test";
public $test1 = "test1";

public function set_flag($flag)
{
$this->flag = $flag;

}
public function get_flag()
{
return $this->flag;
}
}
$object = new test();
$object->set_flag('Active');
$data = serialize($object);
echo $data;
echo '<hr>';
#O:4:"test":3:{s:10:"testflag";s:6:"Active";s:7:"*test";s:4:"test";s:5:"test1";s:5:"test1";}
echo 'aaa';
?>

//unserialize()接收的参数用户可控,传入构造的字符串,实现攻击
//只序列化属性,不序列化方法
//寻找合适的能够被控制的属性,利用本身存在的方法

<!--只要在魔术方法中存在能利用的函数
对这个对象的属性做特殊的操控
进而影响这些函数的调用逻辑
1>__construct()
2>__sleep()
3>__wakeup()
4>__destruct()
5>__toString()把对象当作字符串使用时
6>__invoke()把对象当函数使用时
7>__call()调用对象不存在的方法的时候
-->

php反序列化
https://43.242.201.154/2024/09/01/phpserilize/
Author
Dong
Posted on
September 1, 2024
Licensed under