PHP源码中unserialize函数引发的漏洞分析

简介: 0×01 unserialize函数的概念 首先看下官方给出的解释:unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

0×01 unserialize函数的概念

首先看下官方给出的解释:unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,可为 integer、float、string、array 或 object。如果传递的字符串不可解序列化,则返回 FALSE。若被解序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。

通过PHP官方给出的解释,可以理解unserialize函数是与serialize函数相对应的,它们两个的作用就是将变量进行序列化与反序列化。

为什么需要对变量进行序列化呢?在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果一个脚本中想要调用之前一个脚本的变量,但是前 一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本的调用?这肯定是不现实的。

serialize和unserialize就是解决这一问题的存在,serialize可以讲变量转换为字符串,并且在转换中可以保存当前变量的值;而unserialize则可以将serialize生成的字符串变换回变量。

0×02  利用

再讲利用不正确使用unserialize而导致的问题之前,先再介绍下unserialize工作的过程。unserialize再回复变量之前,会根据serialize生成的字符串中的变量信息,重新创造一个变量,并为它赋值。

利用unserialize的条件要具备一下几点,

1.unserialize函数的参数可控

2.脚本中存在一个构造函数、析构函数、__wakeup()函数中有向php文件中写数据的操作的类

3.所写的内容需要有对象中的成员变量的值

利用的思想就是通过本地构造一个和脚本中符合条件类同名的类,并对能够写入php文件的成员变量赋值,内容为将要执行的php脚本代码(例 如:phpinfo())。然后,本地实例化这个类,并通过调用serialize函数将实例化的对象转换为字符串。最后,将获得的字符串作为 unserialize的参数进行传递。

下面我们通过本地实验,来看下这样利用,最后达到的效果是什么。

PHP源码中unserialize函数引发的漏洞分析

通过上面的这段代码,我们再来熟悉下unserialize的工作流程,14-17行代码,生成a类的一个对象$class,修改其成员变量test的值 为test,并对其进行转换,然后销毁这个对象。后面18-19行通过unserialize恢复原来的对象,并将这个对象赋予变 量$class_unser,最后打印原来成员变量的值,来使我们确认恢复的是否是和之前销毁的内容一样,来看下执行效果

PHP源码中unserialize函数引发的漏洞分析

可以看出unserialize后恢复的对象,其成员值是和之前的对象成员值是一样的。

下面我们将修改这段代码,将其作为漏洞代码,来看下怎么利用unserialize达到攻击的效果,代码修改如下,

PHP源码中unserialize函数引发的漏洞分析

这是存在问题的一段代码,他的作用就是将通过GET方法传进来的字符串进行反序列化。并且他提供了一个名为a的类,这个类的析构函数会创建一个名为123.php的文件,并在其中写入内部成员test的值。最后为了证明效果,我将析构函数生成的文件包含进来了。

我们利用这个问题的思想是,模仿一个a类,并给成员变量test赋予测试代码<?php phpinfo()?>,然后实例化一个a类的对象,并对它进行序列化,具体实现如下,

PHP源码中unserialize函数引发的漏洞分析

执行结果如下

PHP源码中unserialize函数引发的漏洞分析

下面我们将这段序列化字符串作为GET变量传给存在问题的那段脚本,看一下运行结果

PHP源码中unserialize函数引发的漏洞分析

0×03 总结

Unserialize函数在php代码开发中运用的频率还是很频繁的,在代码审计的过程中发现有的程序为了传递参数的方便,对序列化的字符串又进行了一 次base64的加密,以防止字符串被magic_gpc过滤。但是,也同是方便的攻击者绕过magic_gpc提交攻击代码。

如何防护或者预防这种问题的发生?我们可以根据上一章中提出的提出的利用条件来进行预防与防护。

1.要严格控制unserialize函数的参数,坚持用户所输入的信息都是不可靠的原则

2.要对于unserialize后的变量内容进行检查,以确定内容没有被污染

本文作者TPCS 首发90sec转自核攻击博客由网络安全攻防研究室(www.91ri.org)信息安全小组收集整理,转载请著名出处!

目录
相关文章
|
11天前
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
42 18
|
3月前
|
前端开发 关系型数据库 MySQL
PHP外链网盘系统网站源码
> 本文将详细介绍如何从零构建一个基于PHP和MySQL的文件管理系统,分解项目代码并剖析每个模块的功能。我们将以`index.php`、`config.php`和`api.php`这三个核心文件为例,详细展示如何设计文件列表、数据库配置和文件上传接口,从而实现一个完整的文件管理系统。该文章可以作为学术研究和代码实现的参考。
246 98
|
2月前
|
关系型数据库 MySQL PHP
免登录游客卡密发放系统PHP网站源码
这是一个简单易用的卡密验证系统,主要功能包括: 卡密管理和验证,多模板支持,响应式设计,验证码保护,防刷机制,简洁的用户界面, 支持自定义模板,移动端优化,安全性保护,易于部署和维护。
226 77
|
21天前
|
JSON PHP 数据库
PHP成绩查询系统源码
PHP成绩查询系统源码
574 3
|
3月前
|
移动开发 小程序 Linux
PHP仿WX即时聊天源码,支持视频语音聊天
PHP仿WX即时聊天源码,支持视频语音聊天
194 65
|
1月前
|
PHP
2025简约的打赏系统PHP网站源码
2025简约的打赏系统PHP网站源码
60 20
|
1月前
|
PHP 数据库
PHP在线聊天系统源码
PHP在线聊天系统源码
105 18
|
1月前
|
移动开发 前端开发 PHP
PHP盲盒商城系统源码
PHP盲盒商城系统源码
31 0
PHP盲盒商城系统源码
|
3月前
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
146 58
|
2月前
|
搜索推荐 PHP SEO
SEO化在线检测分析PHP源码
SEO化在线检测分析PHP源码,有助于确定您的 SEO 错误并优化您的互联网网页内容以获得更高的搜索引擎评级 还提供与您的竞争对手的逐个方面的 SEO 比较。分析报告甚至可以下载为 PDF 文件以供离线使用 上传服务器后解压安装
77 18