MENU

安全学习-22-反序列化

December 15, 2021 • 网络安全

[TOC]

反序列化

一、什么是序列化

序列号(serialize)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。【将状态信息保存为字符串】

简单的理解:将PHP中对象、类、数组、变量、匿名函数等,转化为字符串,方便保存到数据库或者文件中。

二、什么是反序列化

序列号就是将对象的状态信息转为字符串储存起来,那么反序列化就是再将这个状态信息拿出来使用。(重新再转发为对象或者其他的)【将字符串转化为状态信息】

当在php中创建了一个对象后,可以通过serialize()把这个对象转变为字符串,保存对象的值方便滞后的传递与使用。

serialize()对应的,unserialize()可以从已存储的表示中创建php的值,单就本次环境而言,可以从序列化后的结果中恢复对象(object)。

三、反序列化漏洞

本质上serialize()unserialize()在PHP内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题时候导致的。

当传给unserialize()的参数可控时候,那么用户就可以注入精心构造的payload。当进行反序列的时候就有可能触发对象中的一些魔术方法,造成意想不到的危害。

四、魔术方法和反序列化利用

php中有一类特殊的方法叫"Magic function" (魔术方法):

_construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。

_destruct():当对象被销毁时会自动调用。(析构函数)

_wakeup():如前所提,unserialize()时会自动调用。

五、实战

1.地址

http://59.63.200.79:8010/uns/index.php

1

2.发现可以查看源码

2

发现有个反序列化参数unserialize(),寻找可以利用的方法。

3.通过复制源码本地修改

3

4

分析代码逻辑!

5

4.修改代码满足逻辑条件

6

7

8

但是由于输出的时候,是通过循环输出,所以我们要将其构造为数组!

5.继续修改代码

9

10


6.Cookie进行URL编码

使用Cookie必须使用url编码!得到:

// 原数据
e2d4f7dcc43ee1db7f69e76303d0105ca:1:{i:0;O:6:"readme":1:{s:6:"source";s:8:"flag.php";}}

// URL编码后
e2d4f7dcc43ee1db7f69e76303d0105ca%3a1%3a%7bi%3a0%3bO%3a6%3a%22readme%22%3a1%3a%7bs%3a6%3a%22source%22%3bs%3a8%3a%22flag.php%22%3b%7d%7d

7.抓包构造Cookie发包

11

12


反序列化流程

12

PHP常用反序列化方法:phar