我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

又到了黄金三四月跳槽季,很多小伙伴已经开始准备面试了,今天给大家分享一道网络安全中常见的面试题:PHP反序列化漏洞。

虽然PHP反序列化漏洞的利用条件比较苛刻,但是一旦被利用将会带来严重的后果,所以很多公司都比较重视这个技能点,朋友们一定要掌握。

PHP 序列化与反序列化简介

什么是序列化和反序列化

维基百科对其定义如下:序列化()在计算机科学数据处理中是指将数据结构或对象状态转换为可访问格式(例如将其保存在文件中、存储在缓冲区中或通过网络发送)的过程,以便稍后可以在同一个或另一个计算机环境中恢复到其原始状态。

概念很好理解,其实就是把数据转换成可逆的数据结构,自然而然的,逆向的过程就叫做反序列化。

那么序列化和反序列化有什么用呢?

例如:

比如我们现在都在淘宝上买桌子,这种不规则的物品怎么从一个城市运输到另一个城市呢?一般都是拆开成木板,装进箱子里,然后快递出去。这个过程类似于我们的序列化过程(把数据转换成可以存储或者传输的形式)。买家收到货的时候,需要自己把这些木板组装成桌子的形状,这个过程就像反序列化的过程(把它们转换成原始的数据对象)。

也就是说,序列化的目的是为了方便数据的传输和存储。

在PHP应用中,序列化与反序列化一般用于缓存,比如缓存等。

常见的序列化格式:

PHP 序列化和反序列化

PHP通过两个函数实现序列化与反序列化:(mixed$value)和mixed$str。

以下是PHP反序列化漏洞中可能使用的典型魔术方法:

无效(无效)

( ) 会检查是否存在 ( ) 方法,如果存在则先调用该方法,提前准备好对象所需要的资源。

void([混合$args[,$...]])

具有构造函数的类每次创建新对象时都会首先调用此方法。

无效(无效)

当对一个对象的所有引用都被删除或者该对象被明确销毁时,就会执行析构函数。

( 空白 )

() 方法用于告诉类当它被当作字符串处理时应该如何响应。例如,echo $obj; 应该显示一些内容。

此方法必须返回一个字符串,否则会引发 1 级致命错误。

PHP 反序列化漏洞

漏洞原因

PHP反序列化漏洞又称为PHP对象注入,是由于程序对输入数据处理不当造成的。

让我们看一个例子:

构造方法的作用是_php 构造方法_构造方法的特点

在这个例子中,析构函数会回显$test的值,我们可以构造一个对象来控制$test的值,以达到控制数据流的目的,从而利用反序列化漏洞。

施工流程如下:

php 构造方法_构造方法的特点_构造方法的作用是

构造方法的作用是_php 构造方法_构造方法的特点

如何使用

1. ( )旁路

漏洞(CVE-2016-7124)

在反序列化过程中,如果表示对象属性数量的值大于实际的属性数量,则将跳过()的执行。

受影响的版本:

DEMO如下:

构造方法的作用是_php 构造方法_构造方法的特点

构造方法的作用是_php 构造方法_构造方法的特点

构造方法的作用是_php 构造方法_构造方法的特点

2.注入对象构造方法

目标对象被 修改时的构造方法。

示例代码:

php 构造方法_构造方法的特点_构造方法的作用是

构造方法的作用是_php 构造方法_构造方法的特点

使用同名方法

php 构造方法_构造方法的作用是_构造方法的特点

在这个例子中,类B和类C中存在同名的方法,我们可以构造目标对象,让析构函数调用类C的方法,实现任意代码执行。

施工规范:

构造方法的特点_php 构造方法_构造方法的作用是

构造方法的作用是_构造方法的特点_php 构造方法

3.反序列化漏洞

在PHP中,数据被序列化存储,然后在读取的时候反序列化。

相关配置:

.="" //设置存储路径

.="" //设置用户自定义存储函数,如果想使用PHP内置存储机制以外的其他方式,可以使用该函数(数据库等)

. //指定会话模块在请求开始时是否启动会话。默认值为0。

. //定义序列化/反序列化使用的处理器名称,默认使用PHP

PHP 中有三种序列化处理器,如下表所示:

构造方法的作用是_php 构造方法_构造方法的特点

示例代码:

构造方法的作用是_php 构造方法_构造方法的特点

命名。

存储内容序列化为:test|s:4:"test";

不同的处理器,格式也有所不同,当不同的页面使用不同的处理器时,由于处理的序列化格式不同,可能存在反序列化漏洞。

以下演示了漏洞的利用:

构造方法的作用是_构造方法的特点_php 构造方法

该页面有一个类demo3,开启后用PHP处理器进行处理。

构造方法的作用是_构造方法的特点_php 构造方法

通过.php进行设置,并通过.php构建实例。

由于.php与demo3.php使用的序列化处理器不同,我们可以构造一个“误导性”的处理器来达到漏洞利用的目的。

示例构造:

php 构造方法_构造方法的作用是_构造方法的特点

访问demo3.php,成功创建类demo3的实例。

IV. PHAR 使用

1. PHAR 简介

PHAR(Php)是 PHP 中类似于 JAR 的包文件。它在 PHP 5.3 或更高版本中默认启用。此功能使 PHP 可以像 Java 一样轻松地打包和组件化应用程序。应用程序可以打包成 Phar 包并直接在 PHP-FPM 中运行。

2.PHAR 文件结构

PHAR 文件由 3 或 4 个部分组成:

(1)stub//PHAR文件头

Stub是一个简单的PHP文件,最简单的文件头是:

这是可选的。如果使用 ?>,则 ; 和 ?> 之间最多应有一个空格。

文件头必须包含(); 其他没有限制。(PHP通过stub来识别一个文件是PHAR文件,可以利用stub来绕过文件上传检测)

(2)//PHAR文件描述部分存储了文件名,文件大小等信息,如下图所示。

构造方法的作用是_php 构造方法_构造方法的特点

图中标记的地方存放的是( )的Meta-data,有序列化的过程,就一定有反序列化的过程,这个就是我们的注入点。

(3)文件

PHAR 文件内容

(4)[] a for Phar (phar文件专用) //可选签名部分,支持MD5和SHA1

构造方法的作用是_构造方法的特点_php 构造方法

3.攻击方法

Sam 在 2018 年黑帽研究院的演讲主题:

它是一个 PHP Jim,但并不像我们所知的那样它提供了一种新的 PHP 反序列化攻击姿态。PHAR 文件的 Meta-data 可以是任何可以序列化的 PHP 对象。当 PHAR 文件首次被任何文件系统函数通过 phar:// 协议解析时,Meta-data 部分将被反序列化。这个反序列化过程就是我们的攻击点,Meta-data 部分被填充。

漏洞利用条件:

将已挂载且可访问的 PHAR 文件放到目标系统上,然后通过文件系统函数使用 phar:// 伪协议解析目标 PHAR 文件。

下面演示使用过程:

首先创建一个 PHAR 文件。

注意:请将php.ini中的phar选项设置为Off,否则无法生成phar文件。

构造方法的特点_构造方法的作用是_php 构造方法

访问phar.php并在同一目录下生成phar.phar文件。

箭头标记的是Meta-data部分,可以看出就是序列化的结果。

构造方法的作用是_构造方法的特点_php 构造方法

输出之前打包的phar文件中test.txt文件内容,实例化对象成功,并调用析构函数。

由于PHP只通过stub部分来判断一个文件是否为PHAR文件,因此我们可以通过添加文件头,修改后缀的方式来绕过上传检测。

示例代码:

构造方法的作用是_php 构造方法_构造方法的特点

以上就是今天的全部内容了,希望对大家的学习有所帮助,如果大家还想学习其他技能或者工具,可以点击菜单栏的入门小贴士查看相关内容,也可以给我们留言,我们会尽力满足大家的要求,希望小伙伴们在网络安全的路上越走越好!

二维码
扫一扫在手机端查看

本文链接:https://by928.com/3542.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线